📄 101secapp.c
字号:
/*------------------------------------------------------------------*/
/*函数名称:ProcSetNVA() */
/*函数功能:设定命令 */
/*------------------------------------------------------------------*/
void ProcSetNVA(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:ProcAllDataCall() */
/*函数功能:总召唤或分组召唤 */
/*------------------------------------------------------------------*/
void ProcAllDataCall(INT8U Port)
{
INT8U i;
i = Port - 1;
if (!((ComApp[i]->GroupTrn.TypeID == 0) || (ComApp[i]->GroupTrn.TypeID == C_IC_NA)))
{
EnCodeAllDataEnd(Port, C_IC_NA);
return ;
}
if (!(ComApp[i]->AllDataFlag))
{
ComApp[i]->AllDataFlag = TRUE;
ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
ComApp[i]->GroupTrn.TypeID = C_IC_NA;
ComApp[i]->GroupTrn.COT = ComApp[i]->RxMsg->Data[0];
ComApp[i]->GroupTrn.GroupNo = 1;
ComApp[i]->GroupTrn.InfoAddr = LBI;
if (ComApp[i]->RxMsg->Head.PubAddr == BROADCASTADDR)
ComApp[i]->AllDataNum = 0;
else
ComApp[i]->AllDataNum = ComDb[i]->DBCfgs->Info.Logic.DevNum;
if (ComApp[i]->RxMsg->Data[0] != INTROGEN) //分组召唤
{
ComApp[i]->GroupTrn.GroupNo = ComApp[i]->RxMsg->Data[0] - INTROGEN;
if (ComApp[i]->GroupTrn.GroupNo <= 8)
ComApp[i]->GroupTrn.InfoAddr = LBI + 0x80*(ComApp[i]->GroupTrn.GroupNo-1);
else if (ComApp[i]->GroupTrn.GroupNo <= 12)
ComApp[i]->GroupTrn.InfoAddr = LAI + 0x80*(ComApp[i]->GroupTrn.GroupNo-9);
else if (ComApp[i]->GroupTrn.GroupNo == 13)
ComApp[i]->GroupTrn.InfoAddr = LSPI;
else if (ComApp[i]->GroupTrn.GroupNo == 14)
ComApp[i]->GroupTrn.InfoAddr = LBCD;
else if (ComApp[i]->GroupTrn.GroupNo == 15)
ComApp[i]->GroupTrn.InfoAddr = RTUSTATUS;
else if (ComApp[i]->GroupTrn.GroupNo >= 16)
ComApp[i]->GroupTrn.InfoAddr = LBI; //没用
}
EnCodeAllDataConf(Port);
}
else
{
EnCodeAllData(Port);
}
}
/*------------------------------------------------------------------*/
/*函数名称:ProcCounterCall() */
/*函数功能:电度总召唤或分组召唤 */
/*------------------------------------------------------------------*/
void ProcCounterCall(INT8U Port)
{
INT8U i, no, qcc;
i = Port - 1;
if (!((ComApp[i]->GroupTrn.TypeID == 0) || (ComApp[i]->GroupTrn.TypeID == C_CI_NA)))
{
EnCodeAllDataEnd(Port, C_CI_NA);
return ;
}
if (!ComApp[i]->AllDataFlag)
{
ComApp[i]->AllDataFlag = TRUE;
ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
ComApp[i]->GroupTrn.TypeID = C_CI_NA;
ComApp[i]->GroupTrn.COT = ComApp[i]->RxMsg->Data[0];
qcc = ComApp[i]->RxMsg->Data[0];
if ((qcc & 0x3F) == 5) //总召唤
{
ComApp[i]->GroupTrn.GroupNo = 5;
ComApp[i]->GroupTrn.InfoAddr = LBCR;
}
else
{
no = (qcc & 0x3F);
ComApp[i]->GroupTrn.GroupNo = no;
ComApp[i]->GroupTrn.InfoAddr = LBCR + (no-1) * 32;
}
if (ComApp[i]->RxMsg->Head.PubAddr == BROADCASTADDR)
ComApp[i]->AllDataNum = 0;
else
ComApp[i]->AllDataNum = ComDb[i]->DBCfgs->Info.Logic.DevNum;
EnCodeAllDataConf(Port);
}
else
{
EnCodeCounter(Port);
}
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeAllDataConf() */
/*函数功能:总召唤确认帧 */
/*输入说明: */
/*------------------------------------------------------------------*/
void EnCodeAllDataConf(INT8U Port)
{
INT8U i, err;
i = Port - 1;
ComApp[i]->TxMsg.Head.TypeID = ComApp[i]->GroupTrn.TypeID;
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;
ComApp[i]->TxMsg.Data[0] = 0x14;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
ComApp[i]->AppCommand = APP_APPCON;
if (ComApp[i]->GroupTrn.TypeID == C_IC_NA)
ComApp[i]->AppNextFlag |= FNextALLDATA;
else
ComApp[i]->AppNextFlag |= FNextCounter;
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeAllDataEnd() */
/*函数功能:总召唤结束帧 */
/*输入说明: */
/*------------------------------------------------------------------*/
void EnCodeAllDataEnd(INT8U Port, INT8U Cmd)
{
INT8U i;
i = Port - 1;
ComApp[i]->TxMsg.Head.TypeID = Cmd;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
ComApp[i]->TxMsg.Head.COT = ACTTERM;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
ComApp[i]->TxMsg.Data[0] = 0x14;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
ComApp[i]->AppCommand = APP_SENDDATA;
ComApp[i]->AllDataFlag = FALSE;
ComApp[i]->AllDataNum = 0;
if (Cmd == C_IC_NA)
ComApp[i]->AppNextFlag &= (~FNextALLDATA);
else
ComApp[i]->AppNextFlag &= (~FNextCounter);
memset (&ComApp[i]->GroupTrn.TypeID, 0, sizeof (struct PGroupTrn));
if (ComApp[i]->Data1Flag)
ComApp[i]->AppCommand |= APP_HAVEDATA1;
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeAllData() */
/*函数功能:处理全数据 */
/*------------------------------------------------------------------*/
void EnCodeAllData(INT8U Port)
{
BOOL rc;
INT8U i, j, no, err, len;
INT16U num, curnum, ycno;
struct SCDYX yx;
struct DBInfo info;
i = Port - 1;
no = ComApp[i]->GroupTrn.GroupNo;
curnum = ComApp[i]->GroupTrn.InfoAddr % 0x80;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->GroupTrn.DevID;
if ((no >= 1) && (no <= 8)) //处理遥信
{
num = 0x70; //一帧数据个数
info.Type = YXDATA;
info.Start = ComApp[i]->GroupTrn.InfoAddr - LBI;
if ((curnum+num) > 0x80)
{
info.Num = 0x80 - curnum;
ComApp[i]->GroupTrn.GroupNo++;
}
else
info.Num = num;
}
else if ((no >= 9) && (no <= 12)) //处理遥测
{
num = 80;
info.Type = YCDATA;
info.Start = ComApp[i]->GroupTrn.InfoAddr - LAI;
if ((curnum+num) > 0x80)
{
info.Num = 0x80 - curnum;
ComApp[i]->GroupTrn.GroupNo++;
}
else
info.Num = num;
}
else if (no == 13) //处理步位置信息
{
ComApp[i]->GroupTrn.GroupNo = 17;
}
else if (no == 14) //处理BCD码
{
ComApp[i]->GroupTrn.GroupNo = 17;
}
else if (no == 15) //处理子站远动终端
{
ComApp[i]->GroupTrn.GroupNo = 17;
}
else if (no == 16) //处理备用
{
ComApp[i]->GroupTrn.GroupNo = 17;
}
if (ComApp[i]->GroupTrn.GroupNo == 17) //数据发送完毕
{
if (ComApp[i]->AllDataNum < ComDb[i]->DBCfgs->Info.Logic.DevNum) //指向下一台设备
{
ComApp[i]->AllDataNum++;
if (!GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX))
{
EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
return ;
}
else
{
ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
}
}
else
{
EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
return ;
}
}
rc = DBRead(ComApp[i]->Tmpbuf, &info); //读取数据
switch (info.Type) //组帧
{
case YXDATA:
if (info.Num)
{
if (ComApp[i]->YXTypeID == M_PS_NA)
{
len = 0;
no = 0;
memset ((INT8U*)&yx, 0, sizeof (struct SCDYX));
yx.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
for (j=0; j<info.Num; j++)
{
if (ComApp[i]->Tmpbuf[j] == YX_H)
yx.ST |= (0x0001<<len);
len++;
if (len >= 16)
{
if (no == 0)
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&yx, sizeof (struct SCDYX));
else
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[no*sizeof (struct SCDYX) - 2], (INT8U*)&yx, sizeof (struct SCDYX));
len = 0;
no++;
yx.ST = 0;
yx.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + no*16;
}
}
if (len != 0)
{
if (no == 0)
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&yx, sizeof (struct SCDYX));
else
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[no*sizeof (struct SCDYX) - 2], (INT8U*)&yx, sizeof (struct SCDYX));
no++;
}
ComApp[i]->TxMsg.Head.TypeID = M_PS_NA;
ComApp[i]->TxMsg.Head.VSQ = info.Num;
ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + no * sizeof (struct SCDYX) - 2;
ComApp[i]->AppCommand = APP_SENDDATA;
ComApp[i]->GroupTrn.InfoAddr += info.Num;
}
else
{
for (j=0; j<info.Num; j++)
{
if (ComApp[i]->Tmpbuf[j] == YX_H)
ComApp[i]->TxMsg.Data[j] = 0x01;
else
ComApp[i]->TxMsg.Data[j] = 0x00;
}
ComApp[i]->TxMsg.Head.TypeID = M_SP_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x80 | info.Num;
ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num;
ComApp[i]->AppCommand = APP_SENDDATA;
ComApp[i]->GroupTrn.InfoAddr += info.Num;
}
}
if ((!rc) || (info.Num != num))
{
if (ComApp[i]->GroupTrn.COT == REQ) //处理单组
ComApp[i]->GroupTrn.GroupNo = 17;
else
{
ComApp[i]->GroupTrn.GroupNo = 9;
ComApp[i]->GroupTrn.InfoAddr = LAI;
}
}
break;
case YCDATA:
if (info.Num)
{
ComApp[i]->Data2Flag &= (~HaveNVA);
ycno = GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
memcpy ((INT8U*)&ComApp[i]->YCValue[ycno], ComApp[i]->Tmpbuf, info.Num * 2);
if (ComApp[i]->YCTypeID == M_ME_NA)
{
len = 3;
ComApp[i]->TxMsg.Head.TypeID = M_ME_NA;
for (j=0; j<info.Num; j++)
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[3*j], &ComApp[i]->Tmpbuf[2*j], 2);
ComApp[i]->TxMsg.Data[3*j + 2] = 0x00; //QDS
}
}
else
{
len = 2;
ComApp[i]->TxMsg.Head.TypeID = M_ME_ND;
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[0], ComApp[i]->Tmpbuf, info.Num * 2);
}
ComApp[i]->TxMsg.Head.VSQ = 0x80 | info.Num;
ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num * len;
ComApp[i]->AppCommand = APP_SENDDATA;
ComApp[i]->GroupTrn.InfoAddr += info.Num;
}
if ((!rc) || (info.Num != num))
{
if (ComApp[i]->GroupTrn.COT == REQ) //处理单组
ComApp[i]->GroupTrn.GroupNo = 17;
else
{
ComApp[i]->GroupTrn.GroupNo = 13;
ComApp[i]->GroupTrn.InfoAddr = LSPI;
}
}
break;
default:
break;
}
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
/*------------------------------------------------------------------*/
/*函数名称:EnCodeCounter() */
/*函数功能:处理电度召唤 */
/*------------------------------------------------------------------*/
void EnCodeCounter(INT8U Port)
{
BOOL rc;
INT8U i, j, len, err, qcc;
INT16U ddno;
struct DBInfo info;
struct Counter counter;
i = Port - 1;
len = sizeof (struct Counter);
qcc = ComApp[i]->GroupTrn.COT;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->GroupTrn.DevID;
info.Type = DDDATA;
info.Start = ComApp[i]->GroupTrn.InfoAddr - LBCR;
info.Num = 32;
rc = DBRead(ComApp[i]->Tmpbuf, &info); //读取数据
if (!rc)
{
EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
return ;
}
if (info.Num)
{
if ((qcc & 0xC0)== 0x80) //冻结复位
{
ddno = GetActDevNo(Port, ComApp[i]->NvaActDev, DDDATA);
for (j=0; j<info.Num; j++)
{
counter.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + j;
counter.Value = *((INT32U*)ComApp[i]->Tmpbuf + j) - ComApp[i]->DDValue[ddno + j];
counter.SQ = j;
if (j == 0)
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&counter, len);
else
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*len-2], (INT8U*)&counter, len);
}
memcpy ((INT8U*)&ComApp[i]->DDValue[ddno], ComApp[i]->Tmpbuf, info.Num * 4);
}
else //冻结不复位
{
ddno = GetActDevNo(Port, ComApp[i]->NvaActDev, DDDATA);
for (j=0; j<info.Num; j++)
{
counter.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + j;
counter.Value = *((INT32U*)ComApp[i]->Tmpbuf + j);
counter.SQ = j;
if (j == 0)
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&counter, len);
else
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*len-2], (INT8U*)&counter, len);
}
}
ComApp[i]->TxMsg.Head.TypeID = M_IT_NA;
ComApp[i]->TxMsg.Head.VSQ = info.Num;
if (ComApp[i]->GroupTrn.GroupNo == 5)
ComApp[i]->TxMsg.Head.COT = REQCOGCN;
else
ComApp[i]->TxMsg.Head.COT = REQCOGCN + ComApp[i]->GroupTrn.GroupNo; //dingding
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num * len - 2;
ComApp[i]->AppCommand = APP_SENDDATA;
ComApp[i]->GroupTrn.InfoAddr += info.Num;
}
else
{
EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
return ;
}
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
/*------------------------------------------------------------------*/
/*函数名称:ProcTimeDelay() */
/*函数功能:延时获得命令 */
/*------------------------------------------------------------------*/
void ProcTimeDelay(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:ProcClock() */
/*函数功能:对钟命令 */
/*输入说明:Con--为TRUE时需要确认 */
/*------------------------------------------------------------------*/
void ProcClock(INT8U Port, BOOL Conf)
{
INT8U i;
i = Port - 1;
if (ComApp[i]->BaseControl & SETSECTIME)
{
if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT)
SetTime((void*)ComApp[i]->RxMsg->Data, IEC101TIME);
else
SetTime((void*)ComApp[i]->RxMsg->Data, IEC101EXTTIME);
}
if (Conf)
EnCodeClock(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:ProcReset() */
/*函数功能:复位进程命令 */
/*------------------------------------------------------------------*/
void ProcReset(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:ProcReadData() */
/*函数功能:读数据命令 */
/*------------------------------------------------------------------*/
void ProcReadData(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:ProcTest() */
/*函数功能:测试命令 */
/*------------------------------------------------------------------*/
void ProcTest(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:ProcParaSet() */
/*函数功能:装载参数命令 */
/*------------------------------------------------------------------*/
void ProcParaSet(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:ProcAppErr() */
/*函数功能:应用层命令错误或无法解释处理 */
/*------------------------------------------------------------------*/
void ProcAppErr(INT8U Port)
{
/*
ComApp[i]->TxLen = 0;
ComApp[i]->AppCommand = APP_APPCON;
if (ComApp[i]->Data1Flag)
ComApp[i]->AppCommand |= APP_HAVEDATA1;
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -