📄 dnpsec.c
字号:
}
info.Type = DDDATA;
info.Start = 0;
DBRead((INT8U*)val, &info);
alo->buf[5] = AL_OV_A_32BIT;
alo->buf[6] = 0x07;
alo->buf[7] = num; //总遥测个数
for( i=0;i<num;i++)
{
alo->buf[8+4*i] = LOW(val[i]);
alo->buf[8+4*i+1] = HIGH(val[i]);
alo->buf[8+4*i+2] = LOW(val[i]>>16);
alo->buf[8+4*i+3] = HIGH(val[i]>>16);
}
AppSend(m_wIIN[port-1], AL_OG_CON, 8+alo->buf[7]*4,port);
}
/*------------------------------------------------------------------------
Procedure: SendCOS
Purpose: 传送变化遥信(COS).
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SendCOS(INT8U port)
{
INT8U CosMem[sizeof(struct COS_t)*25];
struct DBInfo info;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
}
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
if(!(m_wIIN[port-1]&AL_IIN_CLASS1))
{
memset(CosMem,0,sizeof(struct COS_t)*25);
memset(&DnpCosinfo[port-1],0,sizeof(struct DBInfo));
}
info.Type = COSDATA;
info.Start = STARTTYPE;
info.Num = 25;
if(DBRead(CosMem, &info)==FALSE && !(m_wIIN[port-1]&AL_IIN_CLASS1))
{SendStatus(AL_IIN_ZERO,port); return ;}
if(info.Num == 0)
{
SendStatus(AL_IIN_ZERO,port); return;
}
Sequence[port-1] = ali->buf[0]&0x0F;
alo->buf[5]=AL_OV_SOE_N_TIME; alo->buf[6]=0x28;
DnpCosinfo[port-1].DevID = info.DevID;
DnpCosinfo[port-1].Type = COSDATA;
DnpCosinfo[port-1].Start = 0xffff;
DnpCosinfo[port-1].Num = info.Num;
DnpCosinfo[port-1].SuperID = info.SuperID;
memcpy((INT8U*)&alo->buf[9],&CosMem[0],sizeof(struct COS_t)*info.Num);
alo->buf[7]=info.Num; alo->buf[8]=0;
AppSend(m_wIIN[port-1], AL_OG_SOE, 9+3*info.Num, port);
// alo->buf[0]=AL_AC_FIR + AL_AC_FIN + AL_AC_CON + Sequence[port-1];
}
/*------------------------------------------------------------------------
Procedure: SendSOE
Purpose: 传送事项记录(SOE).单包传送SOE最大数(249-9)/9.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SendSOE(INT8U port)
{
UCHAR i;
INT8U SoeMem[sizeof(struct SOE_t)*25];
struct DBInfo info;
INT8U size, tmp[6];
stIPacket *ali = NULL;
stOPacket *alo = NULL;
SoeReadPoint *soe = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
soe = SoeReadCom1;
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
soe = SoeReadCom2;
}
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
if(!(m_wIIN[port-1]&AL_IIN_CLASS2))
{
memset(SoeMem,0,sizeof(struct SOE_t)*25);
memset(&DnpSoeinfo[port-1],0,sizeof(struct DBInfo));
}
info.Type = SOEDATA;
info.Start = STARTTYPE;
info.Num = 25;
if(DBRead(SoeMem, &info)==FALSE && !(m_wIIN[port-1]&AL_IIN_CLASS2))
{SendStatus(AL_IIN_ZERO,port); return ;}
if(info.Num == 0)
{
SendStatus(AL_IIN_ZERO,port); return;
}
Sequence[port-1] = ali->buf[0]&0x0F;
alo->buf[5]=AL_OV_SOE_A_TIME; alo->buf[6]=0x28;
DnpSoeinfo[port-1].DevID = info.DevID;
DnpSoeinfo[port-1].Type = SOEDATA;
DnpSoeinfo[port-1].Start = 0xffff;
DnpSoeinfo[port-1].Num = info.Num;
DnpSoeinfo[port-1].SuperID = info.SuperID;
size = 0;
for(i=0;i<info.Num;i++)
{
TimeChange((void*)tmp, DNPTIME, (void*)&SoeMem[3+size],ABSTIME);
memcpy (&SoeMem[3+size], tmp, 6);
size += sizeof(struct SOE_t);
}
memcpy((INT8U*)&alo->buf[9],&SoeMem[0],sizeof(struct SOE_t)*info.Num);
alo->buf[7]=info.Num; alo->buf[8]=0;
AppSend(m_wIIN[port-1], AL_OG_SOE, 9+9*info.Num, port);
// alo->buf[0]=AL_AC_FIR + AL_AC_FIN + AL_AC_CON + Sequence[port-1];
}
/*------------------------------------------------------------------------
Procedure: SelectYK ID:1
Purpose: 遥控预置.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void SelectYK(INT8U port)
{
struct BOCode code;
struct DBInfo info;
INT16U YKID;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
}
alo->buf[5] = AL_OV_YK_1; alo->buf[6] = 0x28;
alo->buf[7] = 0x01; alo->buf[8] = 0x00;
memmove((void*)&(alo->buf[9]), (void *)&(ali->buf[7]), 12);
YKID = ali->buf[7];
if(!DnpSecPadPara[port-1]->EnYk)
{
alo->buf[21] = 5;
AppSend(m_wIIN[port-1], AL_OG_YK, 22, port);
return ;
}
if((ali->buf[9]&0xE0) == DNP_AL_YK_H)
{
code.Control = BOCLOSE;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
info.Type = BORESQ;
info.Start = YKID;
info.Num = BOSELECT;
code.Status = 0;
DBOperate ((INT8U*)&code, &info);
if (code.Status == BORCOK)
{
alo->buf[21] = 0;
return ; //预置成功
}
else
alo->buf[21] = 5; //预置失败
}
else if((ali->buf[9]&0xE0) == DNP_AL_YK_F)
{
code.Control = BOOPEN;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
info.Type = BORESQ;
info.Start = YKID;
info.Num = BOSELECT;
code.Status = 0;
DBOperate ((INT8U*)&code, &info);
if (code.Status == BORCOK)
{
alo->buf[21] = 0; //预置成功
return ;
}
else
alo->buf[21] = 5; //预置失败
}
// else if((ali->buf[9]&0xE0) == DNP_AL_YK_DEL)
else
{
code.Control = ali->buf[9];//BODEL | 0x80;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
info.Type = BORESQ;
info.Start = YKID;
info.Num = BOSELECT;
code.Status = 0;
DBOperate ((INT8U*)&code, &info);
if (code.Status == BORCOK)
{
alo->buf[21] = 0; //成功
return ;
}
else
alo->buf[21] = 5; //失败
}
// else
// alo->buf[21] = 3; //控制码错
AppSend(m_wIIN[port-1], AL_OG_YK, 22, port);
}
/*------------------------------------------------------------------------
Procedure: OperateYK ID:1
Purpose: 遥控执行/撤销.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void OperateYK(INT8U port)
{
struct BOCode code;
struct DBInfo info;
INT16U YKID;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
}
alo->buf[5] = AL_OV_YK_1; alo->buf[6] = 0x28;
alo->buf[7] = 0x01; alo->buf[8] = 0x00;
memmove((void *)&(alo->buf[9]), (void *)&(ali->buf[7]), 12);
YKID = ali->buf[7];
/* if((ali->buf[9]&0xE0) == DNP_AL_YK_DEL)
{
code.Control = BODEL;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
info.Type = BORESQ;
info.Start = YKID;
info.Num = BOSELECT;
code.Status = 0;
DBOperate ((INT8U*)&code, &info);
if (code.Status == BORCOK)
{
alo->buf[21] = 0; //成功
// return ;
}
else
alo->buf[21] = 5; //失败
}*/
if ((ali->buf[9]&0xE0) == DNP_AL_YK_H)
{
code.Control = BOCLOSE;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
info.Type = BORESQ;
info.Start = YKID;
info.Num = BOOPERATE;
code.Status = 0;
DBOperate ((INT8U*)&code, &info);
if (code.Status == BORCOK)
{
alo->buf[21] = 0; //成功
return ;
}
else
alo->buf[21] = 5; //失败
}
else if ((ali->buf[9]&0xE0) == DNP_AL_YK_F )
{
code.Control = BOOPEN;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
}
info.Type = BORESQ;
info.Start = YKID;
info.Num = BOOPERATE;
code.Status = 0;
DBOperate ((INT8U*)&code, &info);
if (code.Status == BORCOK)
{
alo->buf[21] = 0; //成功
return ;
}
else
alo->buf[21] = 5; //失败
}
else alo->buf[21] = 3; //控制码错
AppSend(m_wIIN[port-1], AL_OG_YK, 22, port);
}
/*------------------------------------------------------------------------
Procedure: AppSend ID:1
Purpose: 公共发送函数.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void AppSend(USHORT iin, UCHAR obj, USHORT count,INT8U port)
{
INT8U err;
stIPacket *ali = NULL;
stOPacket *alo = NULL;
if(port == COM1)
{
ali = aliCom1;
alo = aloCom1;
}
else if(port == COM2)
{
ali = aliCom2;
alo = aloCom2;
}
if(obj == AL_OG_SOE)
alo->buf[0]=AL_AC_FIR + AL_AC_FIN + AL_AC_CON + Sequence[port-1];
else
alo->buf[0] = 0xC0 + (ali->buf[0]&0x0F);
alo->buf[1] = AL_FC_REPLY;
alo->buf[2] = LOW(iin);
alo->buf[3] = HIGH(iin);
alo->buf[4] = obj;
alo->dest = ali->source; alo->count = count;
alo->ready = TRUE; alo->service = DL_SEND_NOCF;
bsending[port-1] = obj;
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);
}
int CheckAddr(INT16U SourceAddr,INT16U DesAddr,INT8U port)
{ /*校验目的地址*/
if(SourceAddr==0xFFFF)
{
TimeFlag = TRUE;
return 0; /*公共站号*/
}
if(port == COM1)
{
if((SourceAddr==pp1->DBCfgs->Address)&&(DesAddr==pp1->DBCfgs->MAddress))
{
TimeFlag = FALSE;
return 1;
}
}
if(port == COM2)
{
if((SourceAddr==pp2->DBCfgs->Address)&&(DesAddr==pp2->DBCfgs->MAddress))
{
TimeFlag = FALSE;
return 1;
}
}
return -1; /*无效站号*/
}
/*------------------------------------------------------------------------
Procedure: AppYcVar ID:1
Purpose: 变化遥测.
Input: 置位遥测变化;
Output: 变化遥测.
Errors:
------------------------------------------------------------------------*/
INT16U AppYcVar(INT8U port)
{
INT16U num,i;
INT8U *value;
INT16S new_yc,old_yc;
INT16U VarYcNum;
struct DBInfo info;
info.Type = YCDATA;
info.Start = 0;
if(port == COM1)
{
info.SuperID = pp1->DBCfgs->DevID;
info.DevID = pp1->DBCfgs->DevID;
info.Num = pp1->DBCfgs->YCNum;
value = YC_Value[0];
}
if(port == COM2)
{
info.SuperID = pp2->DBCfgs->DevID;
info.DevID = pp2->DBCfgs->DevID;
info.Num = pp2->DBCfgs->YCNum;
value = YC_Value[1];
}
DBRead(value, &info);
num = info.Num;
VarYcNum = 0;
for(i=0;i<num;i++)
{
new_yc = (INT16S)(MERGE(*(value+i*2+1),*(value+i*2)));
if(port==COM1)
{
old_yc = VarYcValueStruct[0][i].YcValue;
// if( abs(new_yc-old_yc) > *(YCDValue[0]+i))
if (new_yc > (*(YCDValue[1]+i) + old_yc) || new_yc < (*(YCDValue[1]+i) - old_yc))
{
VarYcValueStruct[0][i].YcNo = TRUE;
VarYcValueStruct[0][i].YcValue = new_yc;
VarYcNum++;
}
}
else if(port==COM2)
{
old_yc = VarYcValueStruct[1][i].YcValue;
// if( abs(new_yc-old_yc) > *(YCDValue[1]+i))
if (new_yc > (*(YCDValue[1]+i) + old_yc) || new_yc < (*(YCDValue[1]+i) - old_yc))
{
VarYcValueStruct[1][i].YcNo = TRUE;
VarYcValueStruct[1][i].YcValue = new_yc;
VarYcNum++;
}
}
}
return VarYcNum;
}
void YkRespond(struct SysPort *info, struct DBBOOPInfo *msg, INT8U port)
{
stOPacket *alo = NULL;
if(port == COM1)
{
alo = aloCom1;
}
else if(port == COM2)
{
alo = aloCom2;
}
alo->buf[5] = AL_OV_YK_1; alo->buf[6] = 0x28;
alo->buf[7] = 0x01; alo->buf[8] = 0x00;
alo->buf[9] = LOW(msg->SID); alo->buf[10] = HIGH(msg->SID);
alo->buf[11] = LOW(msg->Status); alo->buf[12] = 0x01;
alo->buf[13] = 0x0; alo->buf[14] = 0x0;
alo->buf[15] = 0x0; alo->buf[16] = 0x0;
alo->buf[17] = 0x0; alo->buf[18] = 0x0;
alo->buf[19] = 0x0; alo->buf[20] = 0x0;
alo->buf[21] = 0x0;
AppSend(m_wIIN[port-1], AL_OG_YK, 22, port);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -