📄 101secapp.c
字号:
/*------------------------------------------------------------------*/
/*函数名称:EnCodeClock() */
/*函数功能:编辑时钟确认响应帧 */
/*------------------------------------------------------------------*/
void EnCodeClock(INT8U Port)
{
INT8U i;
i = Port - 1;
ComApp[i]->TxMsg.Head.TypeID = C_CS_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
ComApp[i]->TxMsg.Head.COT = ACTCON;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT)
GetTime((void*)ComApp[i]->TxMsg.Data, IEC101TIME);
else
GetTime((void*)ComApp[i]->TxMsg.Data, IEC101EXTTIME);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + sizeof (struct IEC101Time_t);
ComApp[i]->AppCommand = APP_APPCON;
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeControl() */
/*函数功能:编辑控制命令响应帧 */
/*------------------------------------------------------------------*/
void EnCodeControl(INT8U Port, struct DBBOOPInfo* Info)
{
INT8U i, dco;
i = Port - 1;
ComApp[i]->TxMsg.Head.TypeID = C_DC_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
if (Info->Status & BODEL)
ComApp[i]->TxMsg.Head.COT = DEACTCON;
else
ComApp[i]->TxMsg.Head.COT = ACTCON;
if (Info->Flag & BOOPERROR)
ComApp[i]->TxMsg.Head.COT |= P101_PN;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = Info->SID + LBO - 1;
if (Info->Status & BOCLOSE)
dco = 0x02;
else
dco = 0x01;
if (Info->Flag & BOOPSELECT)
dco |= DCO_SE;
ComApp[i]->TxMsg.Data[0] = dco;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
ComApp[i]->AppCommand = APP_APPCON;
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeCOS() */
/*函数功能:编辑COS帧 */
/*------------------------------------------------------------------*/
void EnCodeCOS(INT8U Port)
{
BOOL rc;
INT8U i, j, len, num;
struct DBInfo info;
struct COS_t *cos;
i = Port - 1;
num = 0;
len = sizeof (struct COS_t);
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->ActDevIndex;
info.Type = COSDATA;
info.Start = STARTTYPE;
info.Num = 0x40; //dingding?
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if ((!rc) || (info.Num == 0))
continue;
for (; num<info.Num; num++)
{
cos = ((struct COS_t*)ComApp[i]->Tmpbuf + num);
cos->No = LBI + cos->No;
if (cos->Status == YX_H)
cos->Status = 0x01;
else
cos->Status = 0x00;
if (num == 0)
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)cos, len);
else
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[1 + (num-1)*len], (INT8U*)cos, len);
}
ComApp[i]->TxMsg.Head.TypeID = M_SP_NA;
ComApp[i]->TxMsg.Head.VSQ = info.Num;
ComApp[i]->TxMsg.Head.COT = REQ;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num*len - 2;
ComApp[i]->AppCommand = APP_SENDDATA;
ComApp[i]->LastDevIndex = ComApp[i]->ActDevIndex;
ComApp[i]->LastDevType = COSDATA;
ComApp[i]->LastDevNum = info.Num;
return;
}
ComApp[i]->Data1Flag &= (~HaveCOS);
ComApp[i]->AppCommand = APP_NODATA;
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeReadData() */
/*函数功能:编辑读命令 */
/*------------------------------------------------------------------*/
void EnCodeReadData(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeSOE() */
/*函数功能:编辑SOE帧 */
/*------------------------------------------------------------------*/
void EnCodeSOE(INT8U Port)
{
BOOL rc;
INT8U i, j, len, num;
struct DBInfo info;
struct SOE_t *soe;
struct SOECP24Time time;
i = Port - 1;
num = 0;
len = sizeof (struct SOECP24Time);
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->ActDevIndex;
info.Type = SOEDATA;
info.Start = STARTTYPE;
info.Num = 0x20; //dingding?
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if ((!rc) || (info.Num == 0))
{
rc = GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX);
if (rc)
continue;
else
break;
}
for (; num<info.Num; num++)
{
soe = ((struct SOE_t*)ComApp[i]->Tmpbuf + num);
time.No = LBI + soe->No;
if (soe->Status == YX_H)
time.Status = 0x01;
else
time.Status = 0x00;
time.Minute = soe->Time.Minute % 60;
time.Msecond = soe->Time.Msecond;
if (num == 0)
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&time, len);
else
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[4 + (num-1)*len], (INT8U*)&time, len);
}
ComApp[i]->TxMsg.Head.TypeID = M_SP_TA;
ComApp[i]->TxMsg.Head.VSQ = info.Num;
ComApp[i]->TxMsg.Head.COT = REQ;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num*len - 2;
ComApp[i]->AppCommand = APP_SENDDATA;
ComApp[i]->LastDevIndex = ComApp[i]->ActDevIndex;
ComApp[i]->LastDevType = SOEDATA;
ComApp[i]->LastDevNum = info.Num;
return ;
}
ComApp[i]->Data2Flag &= (~HaveSOE);
ComApp[i]->AppCommand = APP_NODATA;
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeFA() */
/*函数功能:编辑故障检测数据帧 */
/*------------------------------------------------------------------*/
void EnCodeFA(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeNVA() */
/*函数功能:编辑变化遥测帧 */
/*------------------------------------------------------------------*/
void EnCodeNVA(INT8U Port)
{
BOOL rc;
INT8U i, j, k, num;
INT16U tmp, no, len;
struct MENA yc;
struct DBInfo info;
i = Port - 1;
num = 0;
len = 4;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->NvaActDev;
info.Type = YCDATA;
info.Start = ComApp[i]->NvaActDevCur;
info.Num = 0x80; //dingding?
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if ((!rc) || (info.Num == 0))
{
rc = GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
if (!rc)
{
ComApp[i]->AppCommand = APP_NODATA;
return ;
}
}
else
{
no = GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
for (k=0; k<info.Num; k++)
{
tmp = *((INT16U*)ComApp[i]->Tmpbuf + k);
if ((tmp > ComApp[i]->YCValue[no+k] + ComApp[i]->YCDVal[no+k]) ||
(tmp < ComApp[i]->YCValue[no+k] - ComApp[i]->YCDVal[no+k]))
{
num++;
ComApp[i]->YCValue[no+k] = tmp;
if (ComApp[i]->YCTypeID == M_ME_NA)
{
len = sizeof (struct MENA);
if (num == 1)
{
ComApp[i]->TxMsg.Head.InfoAddr = LAI + k;
*((INT16U*)ComApp[i]->TxMsg.Data) = tmp;
ComApp[i]->TxMsg.Data[2] = 0x00;
}
else
{
yc.InfoAddr = LAI + k;
yc.Value = tmp;
yc.QDS = 0x00;
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[num*len - 7], (INT8U*)&yc, len);
}
}
else
{
if (num == 1)
{
ComApp[i]->TxMsg.Head.InfoAddr = LAI + k;
*((INT16U*)ComApp[i]->TxMsg.Data) = tmp;
}
else
{
*((INT16U*)ComApp[i]->TxMsg.Data + num*2 - 3) = LAI + k;
*((INT16U*)ComApp[i]->TxMsg.Data + num*2 - 2) = tmp;
}
}
}
if (num >= ComApp[i]->MaxYCNum) //一帧发送的最多遥测个数
{
ComApp[i]->NvaActDevCur = k;
break;
}
}
if (info.Num == 0x80) //当前设备一次没有发完
{
ComApp[i]->NvaActDevCur = k;
}
else //下一台设备
{
rc = GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
if (num)
break;
if (!rc)
{
ComApp[i]->Data2Flag &= (~HaveNVA);
ComApp[i]->AppCommand = APP_NODATA;
return ;
}
}
}
} //for
if (num)
{
ComApp[i]->TxMsg.Head.TypeID = ComApp[i]->YCTypeID;
ComApp[i]->TxMsg.Head.VSQ = num;
ComApp[i]->TxMsg.Head.COT = REQ;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->NvaActDev);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + num*len - 2;
ComApp[i]->AppCommand = APP_SENDDATA;
}
else
ComApp[i]->Data2Flag &= (~HaveNVA);
}
/*------------------------------------------------------------------*/
/*函数名称:CheckNVA() */
/*函数功能:检测变化遥测数据,成功返回TRUE */
/*------------------------------------------------------------------*/
BOOL CheckNVA(INT8U Port)
{
BOOL rc;
INT8U i, j, k;
INT16U tmp, no, curdev, num;
struct DBInfo info;
i = Port - 1;
num = 0;
curdev = ComApp[i]->NvaActDev;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->NvaActDev;
info.Type = YCDATA;
info.Start = num;
info.Num = 0x80; //dingding?
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if ((!rc) || (info.Num == 0))
{
rc = GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
if (!rc)
{
ComApp[i]->NvaActDev = curdev;
return (FALSE);
}
}
else
{
no = GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
for (k=0; k<info.Num; k++)
{
tmp = *((INT16U*)ComApp[i]->Tmpbuf + k);
if ((tmp > ComApp[i]->YCValue[no+k] + ComApp[i]->YCDVal[no+k]) ||
(tmp < ComApp[i]->YCValue[no+k] - ComApp[i]->YCDVal[no+k]))
{
ComApp[i]->NvaActDev = curdev;
return (TRUE);
}
}
if (info.Num == 0x80) //当前设备一次没有发完
{
num += 0x80;
}
else //下一台设备
{
rc = GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
if (!rc)
{
ComApp[i]->NvaActDev = curdev;
return (FALSE);
}
}
}
} //for
ComApp[i]->NvaActDev = curdev;
return (FALSE);
}
/*------------------------------------------------------------------*/
/*函数名称:GetYcDeadValue() */
/*函数功能:获得遥测死区值 */
/*输入说明: */
/*------------------------------------------------------------------*/
void GetYcDeadValue(INT8U Port, INT16U Num, INT32U DValue)
{
INT8U i, id;
INT16U num, j;
struct DBInfo info;
i = Port - 1;
num = 0;
for (id=0; id<ComDb[i]->DBCfgs->Info.Logic.DevNum; id++)
{
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComDb[i]->DBCfgs->Info.Logic.pOld[id].DevID;
info.Type = YCFULLVAULE;
info.Num = DBCfgs[info.DevID].YCNum;
info.Start = 0;
DBRead(&ComApp[i]->Tmpbuf[0], &info);
for (j=0; j<info.Num; j++)
{
ComApp[i]->YCDVal[num+j] = DValue * (*((INT16U*)ComApp[i]->Tmpbuf + j)) / 1000; //可能为零
}
num += info.Num;
}
}
/*------------------------------------------------------------------*/
/*函数名称:GetActDevIndexByAddr() */
/*函数功能:通过地址查询设备的是否存在 */
/*输出说明:成功返回TRUE */
/*------------------------------------------------------------------*/
BOOL GetActDevIndexByAddr(INT8U Port, INT16U Addr)
{
INT8U i, j;
INT16U dev;
i = Port - 1;
if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
{
if (Addr == ComDb[i]->DBCfgs->Address)
{
ComApp[i]->ActDevIndex = ComDb[i]->DBCfgs->DevID;
return (TRUE);
}
return (FALSE);
}
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
dev = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
if (Addr == DBCfgs[dev].Address)
{
ComApp[i]->ActDevIndex = dev;
return (TRUE);
}
}
return (FALSE);
}
/*------------------------------------------------------------------*/
/*函数名称:GetAddrByDevIndex() */
/*函数功能:通过设备查询地址的是否存在(针对公共地址) */
/*输出说明:成功返回地址 */
/*------------------------------------------------------------------*/
INT16U GetAddrByDevIndex(INT8U Port, INT16U DevID)
{
INT8U i, j;
i = Port - 1;
//参数输入
if (!(ComApp[i]->Control & 0x04))
return (ComApp[i]->PubAddrBase);
if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
{
if (DevID == ComDb[i]->DBCfgs->DevID)
{
return (ComDb[i]->DBCfgs->Address);
}
return (0);
}
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
if (DevID == ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID)
{
return (DBCfgs[DevID].Address);
}
}
return (0);
}
/*------------------------------------------------------------------*/
/*函数名称:GetNextActDevIndex() */
/*函数功能:激活下一个设备 */
/*输出说明:成功返回TRUE,只有一个设备时返回FALSE */
/*------------------------------------------------------------------*/
BOOL GetNextActDevIndex(INT8U Port, INT16U ActDev, INT8U Flag)
{
INT8U i, j;
INT16U devid;
i = Port - 1;
if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
return (FALSE);
devid = ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;
for (j=0; j<(ComDb[i]->DBCfgs->Info.Logic.DevNum - 1); j++)
{
if (ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID == ActDev)
{
devid = ComDb[i]->DBCfgs->Info.Logic.pOld[j+1].DevID;
break;
}
}
if (Flag == ACTDEVINDEX)
{
ComApp[i]->ActDevIndex = devid;
}
else if (Flag == NVAACTDEV)
{
ComApp[i]->NvaActDev = devid;
}
else
return (FALSE);
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:GetActDevNo() */
/*函数功能:获得当前设备的遥测起始号 */
/*输出说明:返回起始号 */
/*------------------------------------------------------------------*/
INT16U GetActDevNo(INT8U Port, INT16U DevID, INT16U Flag)
{
INT8U i, j;
INT16U num, dev;
i = Port - 1;
num = 0;
if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
return (num);
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
if (DevID == ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID)
return (num);
else
{
dev = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
if (Flag == YCDATA)
num += DBCfgs[dev].YCNum;
else if (Flag == DDDATA)
num += DBCfgs[dev].DDNum;
}
}
return (0); //dingding?
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -