📄 dnpsec.c
字号:
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
}
alo->buf[0] = 0xC0 + (ali->buf[0]&0x0F);
alo->buf[1] = AL_FC_CONFIRM;
alo->buf[2] = LOW(m_wIIN[port-1]);
alo->buf[3] = HIGH(m_wIIN[port-1]);
alo->dest = ali->source; alo->count = 4;
alo->ready = TRUE; alo->service = DL_SEND_NOCF;
if(port == COM1)
OSFlagPost(pp1->Event,Dnp_Al_Ready,OS_FLAG_SET,&err);
if(port == COM2)
OSFlagPost(pp2->Event,Dnp_Al_Ready,OS_FLAG_SET,&err);
}
/*----------------------------------------------------------------------------
Procedure: AppFuction
Purpose: 应用层选择类数据函数.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void AppFuntion(INT32U Class,INT8U port)
{
switch(Class)
{
case 0: SendStatus(AL_IIN_ZERO,port); break;
case 1:
case 2: SendCOS(port); break;
case 3:
case 4: SendYC(port); break;
case 5: SendAllData(port); break;
case 6: SendStatus(AL_IIN_ZERO,port); break;
case 7: SendSOE(port); break;
case 8:
case 9: SendCOS(port); break;
default:SendStatus(AL_IIN_UNOBJ,port); break;
}
}
/*------------------------------------------------------------------------
Procedure: AppRes
Purpose: 应用层回答函数.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void AppRes(INT8U port)
{
static UCHAR FunCode, ObjClass, SubClass, Qualifier;
struct DnpTime_t Dnptm;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
}
FunCode = ali->buf[1]; ObjClass = ali->buf[2];
SubClass = ali->buf[3]; Qualifier = ali->buf[4];
switch(FunCode) {
case AL_FC_CONFIRM: /*作为原方等待副方站确认*/
ResConfirm(port);
break;
case AL_FC_READ:
if(ObjClass==AL_OG_CLASS)
{
if (m_wIIN[port-1]&AL_IIN_CLASS1) AppFuntion(DnpSecPadPara[port-1]->Class1Data,port);//SendYX(port);
else if(m_wIIN[port-1]&AL_IIN_CLASS2) AppFuntion(DnpSecPadPara[port-1]->Class2Data,port);//SendSOE(port);
else if(m_wIIN[port-1]&AL_IIN_CLASS3) AppFuntion(DnpSecPadPara[port-1]->Class3Data,port);//SendSOE(port);
else SendYC(port);
}
else if(ObjClass==AL_OG_YX) SendYX(port);
else if(ObjClass==AL_OG_ANALOG) SendYC(port);
else if(ObjClass==AL_OG_VAR1) /*传送变化数据*/
{
if (m_wIIN[port-1]&AL_IIN_CLASS1) AppFuntion(DnpSecPadPara[port-1]->Class1Data,port);//SendYX(port);
else if(m_wIIN[port-1]&AL_IIN_CLASS2) AppFuntion(DnpSecPadPara[port-1]->Class2Data,port);//SendSOE(port);
else if(m_wIIN[port-1]&AL_IIN_CLASS3) AppFuntion(DnpSecPadPara[port-1]->Class3Data,port);//SendSOE(port);
else
{
if(ValueFlag[port-1])
{
SendVarYC(port);
}
else
{
SendYC(port);
}
}
}
else if(ObjClass==AL_OG_SOE) SendSOE(port);
else if(ObjClass==AL_OG_STATUS) SendStatus(AL_IIN_ZERO,port);
else if(ObjClass==AL_OG_CON)
{
// if(DnpSecPadPara[port-1]->EnDD)
SendDD(port);
// else
// SendStatus(AL_IIN_UNOBJ,port);
}
else SendStatus(AL_IIN_UNOBJ,port);
break;
case AL_FC_WRITE:
/*子站与RTU对钟, TIME=子站发送时间+通道延时+处理延时.*/
if (ObjClass==AL_OG_TIME)
{
Dnptm.Times[0] = ali->buf[6];
Dnptm.Times[1] = ali->buf[7];
Dnptm.Times[2] = ali->buf[8];
Dnptm.Times[3] = ali->buf[9];
Dnptm.Times[4] = ali->buf[10];
Dnptm.Times[5] = ali->buf[11];
if(DnpSecPadPara[port-1]->EnClock)
SetTime((void *)&Dnptm,DNPTIME); //写时间
m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_TIME);
if(TimeFlag == TRUE)
{
TimeFlag = FALSE;
}
else
{
SendStatus(AL_IIN_ZERO,port);
}
}
else SendStatus(AL_IIN_UNOBJ,port);
break;
case AL_FC_SELECT: /*遥控预置*/
if (ObjClass==AL_OG_YK && SubClass==AL_OV_YK_1) {
if (Qualifier==0x28) SelectYK(port);
else SendStatus(AL_IIN_UNIND,port);
}
else SendStatus(AL_IIN_UNOBJ,port);
break;
case AL_FC_OPERATE: /*遥控执行和撤销*/
if (ObjClass==AL_OG_YK && SubClass==AL_OV_YK_1) {
if (Qualifier==0x28) OperateYK(port);
else SendStatus(AL_IIN_UNIND,port);
}
else SendStatus(AL_IIN_UNOBJ,port);
break;
case AL_FC_WARM_RESTART: /*热复位*/
//热复位函数或标志
KillProg(RESET_RETAIN, RESET_DD, TRUE);
break;
case AL_FC_COLD_RESTART: /*冷复位*/
//冷复位函数或标志
KillProg(RESET_CLR, RESET_DD, TRUE);
break;
default: /*未知功能码*/
SendStatus(AL_IIN_UNFUN,port); break;
}
ali->ready=FALSE;
}
/*------------------------------------------------------------------------
Procedure: SendStatus
Purpose: 状态回答(不明对象, 状态查询).
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SendStatus(USHORT iin,INT8U port)
{
AppSend((m_wIIN[port-1]|iin), AL_OG_STATUS, 4,port);
}
/*------------------------------------------------------------------------
Procedure: ResConfirm
Purpose: 确认帧反应.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void ResConfirm(INT8U port)
{
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
}
if ( (ali->buf[0]&0x0F)==Sequence[port-1])
{
if (DnpSoeinfo[port-1].Type == SOEDATA)
{
if(DBClear(&DnpSoeinfo[port-1]))
{
if(!DBCheck(&DnpSoeinfo[port-1]))
m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_CLASS2); /*清SOE上送标志*/
memset((INT8U *)&DnpSoeinfo[port-1],0,sizeof(struct DBInfo));
}
}
if (DnpCosinfo[port-1].Type == COSDATA)
{
if(DBClear(&DnpCosinfo[port-1]))
{
if(!DBCheck(&DnpCosinfo[port-1]))
m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_CLASS1); /*清COS上送标志*/
memset((INT8U *)&DnpCosinfo[port-1],0,sizeof(struct DBInfo));
}
}
}
}
/*------------------------------------------------------------------------
Procedure: SendYX ID:1
Purpose: 送遥信.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SendYX(INT8U port)
{
USHORT index;
INT8U *yxstatus;
INT8U i,yxnum;
struct DBInfo info;
stOPacket *alo = NULL;
if(port == COM1)
{
alo = aloCom1;
yxstatus = YX_Value[0];
}
else if(port == COM2)
{
alo = aloCom2;
yxstatus = YX_Value[1];
}
info.Type = YXDATA;
info.Start = 0;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
info.Num = pp1->DBCfgs->YXNum;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
info.Num = pp2->DBCfgs->YXNum;
}
// yxstatus = malloc(info.Num);
DBRead(yxstatus, &info);
if(port == COM1)
yxnum = pp1->DBCfgs->YXNum;
if(port == COM2)
yxnum = pp2->DBCfgs->YXNum;
index = 5;
alo->buf[index++] = AL_OV_YX_2; alo->buf[index++] = 0x01;
alo->buf[index++] = 0x00; alo->buf[index++] = 0x00;
alo->buf[index++] = yxnum; alo->buf[index++] = 0;
for(i=0;i<yxnum;i++)
{
alo->buf[index++] = yxstatus[i];
}
// free(yxstatus);
// m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_CLASS1);
AppSend(m_wIIN[port-1], AL_OG_YX, index, port);
}
/*------------------------------------------------------------------------
Procedure: SendVarYC ID:1
Purpose: 变化遥测.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SendVarYC(INT8U port)
{
INT16U num;
INT16U i;
struct DBInfo info;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
VarYcValue *VarYc = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
VarYc = VarYcValueStruct[0];
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
VarYc = VarYcValueStruct[1];
}
info.Type = YCDATA;
info.Start = 0;
if(port == COM1)
{
info.Num = pp1->DBCfgs->YCNum;
info.DevID = pp1->DBCfgs->DevID;
info.Num = pp1->DBCfgs->YCNum;
}
if(port == COM2)
{
info.Num = pp2->DBCfgs->YCNum;
info.DevID = pp2->DBCfgs->DevID;
info.Num = pp2->DBCfgs->YCNum;
}
alo->buf[5] = AL_OV_CLASS_2;
alo->buf[6] = 0x17;
num = 0;
for(i=0;i<info.Num;i++)
{
if(VarYc[i].YcNo)
{
alo->buf[8+num*4] = i;
alo->buf[9+num*4] = 1;
alo->buf[10+num*4] = LOW(VarYc[i].YcValue);
alo->buf[11+num*4] = HIGH(VarYc[i].YcValue);
num++;
}
}
alo->buf[7] = num; //变化遥测个数
for(i=0;i<info.Num;i++)
{
if(VarYcValueStruct[port-1][i].YcNo)
{
VarYcValueStruct[port-1][i].YcNo = FALSE;
}
}
AppSend(m_wIIN[port-1], AL_OG_VAR1, 8+alo->buf[7]*4, port);
}
/*------------------------------------------------------------------------
Procedure: SendYC ID:1
Purpose: 将遥测传送到子站.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SendYC(INT8U port)
{
INT16U i;
INT16U num;
INT8U *value;
struct DBInfo info;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
value = YC_Value[0];
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
value = YC_Value[1];
}
info.Type = YCDATA;
info.Start = 0;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
info.Num = pp1->DBCfgs->YCNum;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
info.Num = pp2->DBCfgs->YCNum;
}
// value = malloc(info.Num*2);
DBRead(value, &info);
num = info.Num;
for(i=0;i<num;i++)
{
VarYcValueStruct[port-1][i].YcNo = FALSE;
VarYcValueStruct[port-1][i].YcValue = (INT16S)(MERGE(*(value+i*2+1),*(value+i*2)));
}
alo->buf[5] = AL_OV_A_16BIT;
alo->buf[6] = 0x07;
alo->buf[7] = num; /*总遥测个数*/
ValueFlag[port-1] = TRUE; //可以发变化遥测
memcpy ((char*)alo->buf+8, value, num * 2);
// free(value);
AppSend(m_wIIN[port-1], AL_OG_ANALOG, 8+alo->buf[7]*2, port);
}
/*------------------------------------------------------------------------
Procedure: SendAllData ID:1
Purpose: 送全数据.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SendAllData(INT8U port)
{
USHORT index;
INT8U *yxstatus;
INT8U i,yxnum;
INT8U num;
INT8U *value;
struct DBInfo info;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
yxstatus = YX_Value[0];
value = YC_Value[0];
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
yxstatus = YX_Value[1];
value = YC_Value[1];
}
info.Type = YXDATA;
info.Start = 0;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
info.Num = pp1->DBCfgs->YXNum;
}
if(port == COM2)
{
info.Num = pp2->DBCfgs->YXNum;
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
// yxstatus = malloc(info.Num);
DBRead(yxstatus, &info);
if(port == COM1)
yxnum = pp1->DBCfgs->YXNum;
if(port == COM2)
yxnum = pp2->DBCfgs->YXNum;
index = 5;
alo->buf[index++] = AL_OV_YX_2; alo->buf[index++] = 0x01;
alo->buf[index++] = 0x00; alo->buf[index++] = 0x00;
alo->buf[index++] = yxnum; alo->buf[index++] = 0;
for(i=0;i<yxnum;i++)
{
alo->buf[index++] = yxstatus[i];
}
info.Type = YCDATA;
info.Start = 0;
if(port == COM1)
{
info.Num = pp1->DBCfgs->YCNum;
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.Num = pp2->DBCfgs->YCNum;
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
// value = malloc(info.Num*2);
if(value == NULL)
return ;
DBRead(value, &info);
num = info.Num;
for(i=0;i<num;i++)
{
VarYcValueStruct[port-1][i].YcNo = FALSE;
VarYcValueStruct[port-1][i].YcValue = (INT16S)(MERGE(*(value+i*2+1),*(value+i*2)));
}
alo->buf[index++] = AL_OG_ANALOG;
alo->buf[index++] = AL_OV_A_16BIT;
alo->buf[index++] = 0x07;
alo->buf[index++] = num; //总遥测个数
for(i=0;i<num;i++)
{
alo->buf[index++] = *(value+i*2);
alo->buf[index++] = *(value+i*2+1);
}
ValueFlag[port-1] = TRUE; //可以发变化遥测
// free(yxstatus);
// free(value);
// m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_CLASS1);
AppSend(m_wIIN[port-1], AL_OG_YX, index, port);
}
/*------------------------------------------------------------------------
Procedure: SendDD
Purpose: 将电度传送到子站.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SendDD(INT8U port)
{
int i;
ULONG val[50];
UCHAR num = 0;
struct DBInfo info;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
info.Num = pp1->DBCfgs->YCNum;
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
num = pp1->DBCfgs->YCNum;
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
info.Num = pp2->DBCfgs->YCNum;
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
num = pp2->DBCfgs->DevID;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -