📄 104sa.c
字号:
if (ComApp[i]->TxLen)
S104DLSendProc(Port, (INT8U*)&ComApp[i]->TxMsg, ComApp[i]->TxLen);
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcControl() */
/*函数功能:处理控制命令 */
/*------------------------------------------------------------------*/
void S104ProcControl(INT8U Port)
{
INT8U i, dco;
struct BOCode code;
struct DBInfo info;
struct DBBOOPInfo result;
i = Port - NET1;
memset (&code, 0, sizeof (struct BOCode));
switch (ComApp[i]->RxMsg->Head.TypeID)
{
case C_DC_NA: //遥控操作
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->ActDevIndex;
info.Type = BORESQ;
info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LBO + 1;
dco = ComApp[i]->RxMsg->Data[0];
if (dco & DCO_SE)
info.Num = BOSELECT;
else
info.Num = BOOPERATE;
if ((dco & DCO_DCS) == 0x01)
code.Control |= BOOPEN;
else if ((dco & DCO_DCS) == 0x02)
code.Control |= BOCLOSE;
if (ComApp[i]->RxMsg->Head.COT == ACT)
code.Control &= (~BODEL);
else
code.Control |= BODEL;
code.Status = BORCNONSUPPORT;
if (ComApp[i]->BaseControl & YKPERMIT) //遥控允许
DBOperate((INT8U*)&code, &info);
if (code.Status != BORCOK)
{
result.SuperID = info.SuperID;
result.DevID = info.DevID;
result.ID = info.Start;
result.Status = code.Control;
if (dco & DCO_SE)
result.Flag = BOOPSELECT;
else
result.Flag = BOOPOPERATE;
if (ComApp[i]->RxMsg->Head.COT != ACT)
result.Flag |= BOOPDEL;
result.Flag |= BOOPERROR;
S104EnCodeControl(Port, &result);
}
break;
case C_RC_NA:
break;
case C_SE_NA:
break;
}
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcDB() */
/*函数功能:数据库置位 */
/*------------------------------------------------------------------*/
void S104ProcDB(INT8U Port, INT8U Num)
{
INT8U i, j, tmp;
INT16U dev;
struct DBInfo info;
i = Port - NET1;
if (Num >= ComApp[i]->CurSData)
tmp = ComApp[i]->CurSData;
else
tmp = Num;
for (j=0; j<tmp; j++)
{
if ((ComApp[i]->SData[j].Type == SOEDATA) || (ComApp[i]->SData[j].Type == COSDATA))
{
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->SData[j].DevID;
info.Type = ComApp[i]->SData[j].Type;
info.Num = ComApp[i]->SData[j].Num;
if (!DBClear(&info))
DBClear(&info);
}
}
if (Num < ComApp[i]->CurSData)
{
tmp = ComApp[i]->CurSData - Num;
memcpy ((INT8U*)ComApp[i]->SData, (INT8U*)&ComApp[i]->SData[Num], tmp * sizeof (struct SendData));
ComApp[i]->CurSData = tmp;
}
else
{
ComApp[i]->CurSData = 0;
}
memset ((INT8U*)&ComApp[i]->SData[ComApp[i]->CurSData], 0, (K-ComApp[i]->CurSData) * sizeof (struct SendData));
dev = S104CheckDB(Port, COSDATA);
if (dev != 0xFFFF)
ComApp[i]->AppNextFlag |= HaveCOS;
dev = S104CheckDB(Port, SOEDATA);
if (dev != 0xFFFF)
ComApp[i]->AppNextFlag |= HaveSOE;
}
/*------------------------------------------------------------------*/
/*函数名称:S104CheckDB() */
/*函数功能:查询数据库 */
/*输出说明:有返回有数据的设备ID,没有返回0xFFFF */
/*------------------------------------------------------------------*/
INT16U S104CheckDB(INT8U Port, INT8U Type)
{
INT8U i, j, k, num, tmp;
struct DBInfo info;
i = Port - NET1;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.Type = Type;
switch (Type)
{
case SOEDATA:
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
info.DevID = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
num = DBCheck(&info);
if (num)
{
for (k=0, tmp=0; k<ComApp[i]->CurSData; k++)
{
if ((ComApp[i]->SData[k].DevID == info.DevID) && (ComApp[i]->SData[k].Type == Type))
tmp += ComApp[i]->SData[k].Num;
}
if (tmp < num)
return (info.DevID);
}
}
break;
case COSDATA:
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
info.DevID = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
num = DBCheck(&info);
if (num)
{
for (k=0, tmp=0; k<ComApp[i]->CurSData; k++)
{
if ((ComApp[i]->SData[k].DevID == info.DevID) && (ComApp[i]->SData[k].Type == Type))
tmp += ComApp[i]->SData[k].Num;
}
if (tmp < num)
return (info.DevID);
}
}
break;
default:
break;
}
return (0xFFFF);
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcSetNVA() */
/*函数功能:设定命令 */
/*------------------------------------------------------------------*/
void S104ProcSetNVA(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcAllDataCall() */
/*函数功能:总召唤或分组召唤 */
/*------------------------------------------------------------------*/
void S104ProcAllDataCall(INT8U Port)
{
INT8U i;
i = Port - NET1;
if (!((ComApp[i]->GroupTrn.TypeID == 0) || (ComApp[i]->GroupTrn.TypeID == C_IC_NA)))
{
S104EnCodeAllDataEnd(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; //没用
}
S104EnCodeAllDataConf(Port);
}
else
{
S104EnCodeAllData(Port);
}
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcCounterCall() */
/*函数功能:电度总召唤或分组召唤 */
/*------------------------------------------------------------------*/
void S104ProcCounterCall(INT8U Port)
{
INT8U i, no, qcc;
i = Port - NET1;
if (!((ComApp[i]->GroupTrn.TypeID == 0) || (ComApp[i]->GroupTrn.TypeID == C_CI_NA)))
{
S104EnCodeAllDataEnd(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) * 30;
}
if (ComApp[i]->RxMsg->Head.PubAddr == BROADCASTADDR)
ComApp[i]->AllDataNum = 0;
else
ComApp[i]->AllDataNum = ComDb[i]->DBCfgs->Info.Logic.DevNum;
S104EnCodeAllDataConf(Port);
}
else
{
S104EnCodeCounter(Port);
}
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeAllDataConf() */
/*函数功能:总召唤确认帧 */
/*输入说明: */
/*------------------------------------------------------------------*/
void S104EnCodeAllDataConf(INT8U Port)
{
INT8U i, err;
i = Port - NET1;
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)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = 0x00;
#ifdef INFOADDR3BYTE
ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
#endif
ComApp[i]->TxMsg.Data[0] = 0x14;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
if (ComApp[i]->GroupTrn.TypeID == C_IC_NA)
ComApp[i]->AppNextFlag |= FNextALLDATA;
else
ComApp[i]->AppNextFlag |= FNextCounter;
ComApp[i]->SData[ComApp[i]->CurSData].DevID = ComApp[i]->ActDevIndex;
ComApp[i]->SData[ComApp[i]->CurSData].Type = 0;
ComApp[i]->SData[ComApp[i]->CurSData].Num = 0;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeAllDataEnd() */
/*函数功能:总召唤结束帧 */
/*输入说明: */
/*------------------------------------------------------------------*/
void S104EnCodeAllDataEnd(INT8U Port, INT8U Cmd)
{
INT8U i;
i = Port - NET1;
ComApp[i]->TxMsg.Head.TypeID = Cmd;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
ComApp[i]->TxMsg.Head.COT = ACTTERM;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
#ifdef INFOADDR3BYTE
ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
#endif
ComApp[i]->TxMsg.Data[0] = 0x14;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
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));
ComApp[i]->SData[ComApp[i]->CurSData].DevID = ComApp[i]->ActDevIndex;
ComApp[i]->SData[ComApp[i]->CurSData].Type = 0;
ComApp[i]->SData[ComApp[i]->CurSData].Num = 0;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeAllData() */
/*函数功能:处理全数据 */
/*------------------------------------------------------------------*/
void S104EnCodeAllData(INT8U Port)
{
BOOL rc;
INT8U i, j, no, err, len;
INT16U num, curnum, ycno;
struct SCDYX yx;
struct DBInfo info;
i = Port - NET1;
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 = 120; //一帧数据个数
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 = 60;
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) //数据发送完毕
{
ComApp[i]->AllDataNum++;
if (ComApp[i]->AllDataNum < ComDb[i]->DBCfgs->Info.Logic.DevNum) //指向下一台设备
{
if (!S104GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX))
{
S104EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
return ;
}
else
{
ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
ComApp[i]->GroupTrn.GroupNo = 1;
ComApp[i]->GroupTrn.InfoAddr = LBI;
}
}
else
{
S104EnCodeAllDataEnd(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));
for (j=0; j<info.Num; j++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -