📄 secapp.c
字号:
else
{
S101ProcAllData(Port);
}
if(ComApp[i]->Data1.Flag!=0)//
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
if(ComApp[i]->Data1.Flag&FreezeDD)//冻结电度
{
ComApp[i]->Data1.Flag&=(~FreezeDD);
if(ComApp[i]->EditDDCon==0xFF)
{
ComApp[i]->EditDDCon=0;
EnCodeCounterConf(Port);
}
if(ComApp[i]->Data1.Flag!=0)//
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
if(ComApp[i]->Data1.Flag&CallDD)//传送电度
{
if(ComApp[i]->EditDDCon==0xFF)
{
ComApp[i]->EditDDCon=0;
EnCodeCounterConf(Port);
}
else
{
ProcCounter(Port);
}
if(ComApp[i]->Data1.Flag!=0)//
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
if(ComApp[i]->Data1.Flag&HaveNVA)//变化遥测,如果数据变化频繁会影响其他数据传输,所以放在后面。
{
S101EnCodeNVA(Port);
//ComApp[i]->Data1.Flag &= (~HaveNVA);
if(ComApp[i]->Data1.Flag!=0)//
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
//无一级数据
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_NODATA;
}
//二级数据处理:包括背景数据、循环周期数据
void S101ProcData2(INT8U Port)
{
INT8U i;
i=Port-1;
if(ComApp[i]->Data2Flag&ProtectData)//保护定值数据
{
ComApp[i]->Data2Flag&=(~ProtectData);
SendProtectData(Port);
if(ComApp[i]->Data1.Flag!=0)//
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
if(ComApp[i]->Data2Flag&BackData)//该标志在定时器中设置,发送完数据后清掉
{
S101ProcAllData(Port);
if(ComApp[i]->Data1.Flag!=0)
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
if(ComApp[i]->Data2Flag&UpLoadFile)//文件操作,按照标准要求应比周期数据级别还低。
{
//处理函数
switch(ComApp[i]->FileStep)
{
case CallDir:
SendDir(Port);
break;
case SelectFile:
FileReady(Port);
break;
case CallFile:
SectionReady(Port);
break;
case CallSection:
SendSegments(Port);
break;
case LastSegment:
SendLastSegment(Port);
break;
case LastSection:
SendLastSection(Port);
break;
default:
ComApp[i]->Data2Flag&=(~UpLoadFile);
ComApp[i]->FileStep=FileOver;
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_NODATA;
break;
}
if(ComApp[i]->Data1.Flag!=0)//
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
//召唤二级数据时,无二级数据可能以一级数据应答。都没有以无数据应答。
S101ProcData1(Port);
}
//OK
void S101ProcControl(INT8U Port) //处理遥控,遥控不允许或公共体地址错,不发消息。
{
INT8U i, dco, sco;
struct BOCode code;
struct DBInfo info;
unsigned short InfoAddr;
i = Port - 1;
ComApp[i]->YKTypeID=ComApp[i]->RxTypeID;
InfoAddr=ComApp[i]->RxInfoAddr;
ComApp[i]->YKIDTemp=InfoAddr;
memset (&code, 0, sizeof (struct BOCode));
switch (ComApp[i]->RxTypeID)
{
case C_SC_NA: //单点遥控命令
ComApp[i]->ScoTemp = *(ComApp[i]->pRxData);
sco = *(ComApp[i]->pRxData);
if (!(ComApp[i]->Sec101Pad.PBase.CmdControl&YKPERMIT))//参数设置为不允许遥控
{
ComApp[i]->HaveWrongData=TRUE;
ComApp[i]->WrongDataLength=ComApp[i]->LengthIn;
ComApp[i]->RxMsg[ComApp[i]->CotLocation]=UNKNOWNTYPEID;
ComApp[i]->RxMsg[ComApp[i]->CotLocation]|=0x40;
memcpy((void*)ComApp[i]->WrongData,(void*)ComApp[i]->RxMsg,ComApp[i]->LengthIn);
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
if (S101GetActDevIndexByAddr(Port,ComApp[i]->RxPubAddr))//根据公共体地址查设备序号。
{
ComApp[i]->BODevIndex=ComApp[i]->ActDevIndex;
}
else
{
ComApp[i]->HaveWrongData=TRUE;
ComApp[i]->WrongDataLength=ComApp[i]->LengthIn;
ComApp[i]->RxMsg[ComApp[i]->CotLocation]=UNKNOWNPUBADDR;
ComApp[i]->RxMsg[ComApp[i]->CotLocation]|=0x40;
memcpy((void*)ComApp[i]->WrongData,(void*)ComApp[i]->RxMsg,ComApp[i]->LengthIn);
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->ActDevIndex;
info.Type = BORESQ;
info.Start = InfoAddr - LBO + 1;
if ((sco & SCO_SE) == SCO_SE)
info.Num = BOSELECT;
else
info.Num = BOOPERATE;
if ((sco & SCO_SCS) == 0)
code.Control |= BOOPEN;
else if ((sco & SCO_SCS) == 1)
code.Control |= BOCLOSE;
if ((ComApp[i]->RxCot&COT_REASON)==ACT)
code.Control &= (~BODEL);
else
code.Control |= BODEL;
code.Status = BORCNONSUPPORT;
//向数据库发送遥控命令消息。
if((ComApp[i]->RxCot&COT_TEST)==0)//正常命令,(测试位为1则不能实际操作遥控)
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;
EnCodeControl(Port, &result);
}
*/
break;
case C_DC_NA: //双点遥控命令
case C_RC_NA: //步调节
dco = *ComApp[i]->pRxData;
ComApp[i]->DcoTemp = dco;
if (!(ComApp[i]->Sec101Pad.PBase.CmdControl&YKPERMIT))//参数设置为不允许遥控
{
ComApp[i]->HaveWrongData=TRUE;
ComApp[i]->WrongDataLength=ComApp[i]->LengthIn;
ComApp[i]->RxMsg[ComApp[i]->CotLocation]=UNKNOWNTYPEID;
ComApp[i]->RxMsg[ComApp[i]->CotLocation]|=0x40;
memcpy((void*)ComApp[i]->WrongData,(void*)ComApp[i]->RxMsg,ComApp[i]->LengthIn);
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
if (S101GetActDevIndexByAddr(Port,ComApp[i]->RxPubAddr))//根据公共体地址查设备序号。
{
ComApp[i]->BODevIndex=ComApp[i]->ActDevIndex;
}
else
{
ComApp[i]->HaveWrongData=TRUE;
ComApp[i]->WrongDataLength=ComApp[i]->LengthIn;
ComApp[i]->RxMsg[ComApp[i]->CotLocation]=UNKNOWNPUBADDR;
ComApp[i]->RxMsg[ComApp[i]->CotLocation]|=0x40;
memcpy((void*)ComApp[i]->WrongData,(void*)ComApp[i]->RxMsg,ComApp[i]->LengthIn);
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
return;
}
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComApp[i]->ActDevIndex;
info.Type = BORESQ;
info.Start = InfoAddr - LBO + 1;
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[ComApp[i]->CotLocation] == ACT)
code.Control &= (~BODEL);
else
code.Control |= BODEL;
code.Status = BORCNONSUPPORT;
//向数据库发送遥控命令消息。
if((ComApp[i]->RxCot&COT_TEST)==0)//正常命令,(测试位为1则不能实际操作遥控)
DBOperate((INT8U*)&code, &info);
break;
case C_SE_NA:
break;
}
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
}
//OK
void S101ProcAllDataCall(INT8U Port)
{
INT8U i;
i=Port-1;
ComApp[i]->Data1.Flag|=CallAllData;
ComApp[i]->EditAllDataCon=0xff;
ComApp[i]->Data2Flag&=(~BackData);//清掉背景数据标志
ComApp[i]->GroupTrn.TypeID=C_IC_NA;
ComApp[i]->GroupTrn.COT=ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength];//总召唤限定词 传送原因,
ComApp[i]->GroupTrn.PubAddr=ComApp[i]->RxPubAddr;
if (ComApp[i]->GroupTrn.PubAddr==ComApp[i]->BroadCastAddr)//广播,召唤所有设备数据
{
ComApp[i]->GroupTrn.DevIndex=ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;//总召唤数据从设备序号0开始
ComApp[i]->AllDataNum = 0;
}
else//召唤某一设备数据
{
ComApp[i]->AllDataNum = ComDb[i]->DBCfgs->Info.Logic.DevNum;
if (S101GetActDevIndexByAddr(Port,ComApp[i]->GroupTrn.PubAddr))//根据公共体地址查设备序号。
{
ComApp[i]->GroupTrn.DevIndex=ComApp[i]->ActDevIndex;
}
else//没有对应该公共体地址的设备
{
ComApp[i]->GroupTrn.DevIndex=ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;//总召唤数据从设备序号0开始
}
}
if(ComApp[i]->GroupTrn.COT==INTROGEN)
{
ComApp[i]->GroupTrn.GroupNo=1;//组号从1开始
ComApp[i]->GroupTrn.InfoAddr=LBI;//信息体地址从0x1开始
}
else
{
ComApp[i]->GroupTrn.GroupNo=ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength]-INTROGEN;
ComApp[i]->GroupTrn.InfoAddr=LBI;//信息体地址从0x1开始,该数值有校正。
}
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
}
void S101ProcDDCall(INT8U Port)
{
INT8U i;
i=Port-1;
ComApp[i]->GroupTrnDD.TypeID=C_CI_NA;
ComApp[i]->GroupTrnDD.PubAddr=ComApp[i]->RxPubAddr;
ComApp[i]->GroupTrnDD.Description=ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength];
if((ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength]&0x3f)==5)//电度总召唤
{
ComApp[i]->GroupTrnDD.COT=REQCOGCN;
}
else//分组召唤
{
ComApp[i]->GroupTrnDD.COT=REQCOGCN+((ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength])&0x3f);
}
if(ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength]&0xc0)//冻结电度
{
ComApp[i]->Data1.Flag|=FreezeDD;
ComApp[i]->EditDDCon=0xff;
FreezeCounter(Port);
}
else//读电度
{
ComApp[i]->Data1.Flag|=CallDD;
ComApp[i]->EditDDCon=0xff;
}
if (ComApp[i]->GroupTrnDD.PubAddr==ComApp[i]->BroadCastAddr)//广播,召唤所有设备数据
{
ComApp[i]->GroupTrnDD.DevIndex=ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;//总召唤数据从设备序号0开始
}
else//召唤某一设备数据
{
if (S101GetActDevIndexByAddr(Port, ComApp[i]->GroupTrnDD.PubAddr))//根据公共体地址查设备序号。
{
ComApp[i]->GroupTrnDD.DevIndex=ComApp[i]->ActDevIndex;
}
else//没有对应该公共体地址的设备
{
ComApp[i]->GroupTrnDD.DevIndex=ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;//总召唤数据从设备序号0开始
}
}
if(ComApp[i]->GroupTrnDD.COT==REQCOGCN)//电度总召唤
{
ComApp[i]->GroupTrnDD.GroupNo=1;//组号从1开始
ComApp[i]->GroupTrnDD.InfoAddr=LBCR;//信息体地址从开始
}
else
{
ComApp[i]->GroupTrnDD.GroupNo=ComApp[i]->GroupTrnDD.COT-REQCOGCN;
ComApp[i]->GroupTrnDD.InfoAddr=LBCR;//信息体地址从开始,该数值有校正。
}
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
}
//OK
void S101ProcTimeDelay(INT8U Port)
{
INT8U i;
i=Port-1;
if ((ComApp[i]->RxCot&COT_REASON)==ACT)//6,激活
{
GetTime((void*)(&ComApp[i]->SecSysTimeR),ABSTIME);
ComApp[i]->ReadTimeFlag=0xff;
ComApp[i]->SDTTime=MAKEWORD(ComApp[i]->pRxData[0],ComApp[i]->pRxData[1]);
ComApp[i]->Data1.Flag|=CallTimeDelay;//为了设置一级数据标志
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
}
else if ((ComApp[i]->RxCot&COT_REASON)==SPONT)//3,设置延迟时间
{
ComApp[i]->TimeDelay=MAKEWORD(ComApp[i]->pRxData[0],ComApp[i]->pRxData[1]);
ComApp[i]->LengthOut=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -