📄 com_232.c
字号:
TDATE tmpDate;
BYTE* pt;
DWORD tmp;
if( !Is_Local( _g_dDiValue ) )
{
Send15();
return;
}
//如果 N!=7,报文格式错误!
pt =sBuf+3;
if(*pt >= 8)
{
//tmp:=dTCounter的暂存值
//如果tmp!=dTCounter,中间被中断服务打断,需重新赋值
do
{
WORD v,w;
tmp=dTCounter;
pt=sBuf+4;
tmpDate.wYear=*pt++;
tmpDate.wYear+=((WORD)*pt++)*256;
tmpDate.byMon=*pt++;
tmpDate.byDay=*pt++;
tmpDate.byHour=*pt++;
tmpDate.byMin=*pt++;
w=*pt++;
w+=((WORD)*pt)*256;
v=(WORD)(dTCounter&0x0ffffL)-wFrameCounter;
if( w+v > 0xfffd)
{
w=0xfffd;
}
else
{
w+=v;
}
tmpDate.wMs=w;
}
while(tmp != dTCounter); //若dTcounter变位则重新设置一次
pt=sBuf;
if(*pt == byCpuN) //
{
SYS_Set_Clock(&tmpDate,TRUE); //zym add 2003.4.3
Send11(); //非广播地址则回答11报文
}
}
else
{
pt=sBuf;
if(*pt != 0xff)
{
Send15(); //命令错误,对于非广播报文则回答15报文
}
}
}
//82:读取日历时钟
void ReplyCmd82(BYTE *sBuf,WORD wFrameCounter)
{
Send11();
}
//83:配置信息确认
void ReplyCmd83(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt;
DWORD parm;
pt=sBuf+3;
if(*pt++ != 1)
{
Send15();
}
else
{
parm=*pt;
CommTask(0x84,9,parm);
}
}
//84:读取配置信息
void ReplyCmd84(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt;
int task;
DWORD parm;
pt=sBuf+3;
if(*pt++ != 2)
{
Send15();
return;
}
else
{
task=*pt++; //COMMAND
parm=*pt++; //RI
CommTask(0x84,task,parm);
}
}
//85:复位信号
void ReplyCmd85(BYTE *sBuf,WORD wFrameCounter)
{
Send16();
}
//86:确认事件/SOE
void ReplyCmd86(BYTE *sBuf,WORD wFrameCounter)
{
extern TDICHGMESSAGE tDiMsg;
BYTE *pt=sBuf+3;
int id;
if(*pt++ != 2)
{
Send15(); //N!=2,报文错误,返回否定回答
}
switch( *pt++ )
{
case 1: //17报文指定的事件
id =*pt;
if(id > EVTRECORD_NUMBER-1)
{
//告警、呼唤事件
id -=EVTRECORD_NUMBER;
if(id < ALMRECORD_NUMBER)
{
}
else
{
id -= ALMRECORD_NUMBER;
if(id < EVENTCOPY_NUMBER )
{
}
}
}
else
{
//动作事件
}
break;
case 3: //18报文指定的SOE
id =*pt;
if(id < SOERECORD_NUMBER)
{
}
break;
case 4: //18报文指定的一般开入量变位
id =*pt;
if(id < DIRECORD_NUMBER)
{
}
break;
}
}
//89:标志集读取确认
void ReplyCmd89(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 3)
{
Send15();
}
else
{
DWORD parm;
parm=(DWORD)(*pt++);
parm+=((DWORD)(*pt++)<<8);
parm+=((DWORD)(*pt)<<16);
CommTask(0x8A,19,parm);
}
}
//8A:指定报告的读取标志集
void ReplyCmd8A(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 4)
{
Send15();
}
else
{
int task;
DWORD parm;
task=(int)(*pt++);
parm=(DWORD)(*pt++);
parm+=((DWORD)(*pt++)<<8);
parm+=((DWORD)(*pt)<<16);
CommTask(0x8A,task,parm);
}
}
//8B:删除报告
void ReplyCmd8B(BYTE *sBuf,WORD wFrameCounter)
{
//插入删除报告程序
Send16();
}
//复制事故报告
void ReplyCmd8C(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 3)
{
Send15();
}
else
{
int task;
DWORD parm;
task=(int)(*pt++); // COMMAND
parm=*pt++; // RI/LOBYTE(报告号)
parm+=(((DWORD)*pt)<<8);// HIBYTE(报告号)
CommTask(0x8c,task,parm);
}
}
//应答录波数据读取确认
void ReplyCmd8E(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 4)
{
Send15();
}
else
{
DWORD parm;
parm=*pt++;
parm+=((DWORD)*pt++<<8);
parm+=((DWORD)*pt++<<16);
parm+=((DWORD)*pt<<24);
CommTask(0x8F,19,parm);
}
}
//读取扰动记录表/扰动记录(录波数据)
void ReplyCmd8F(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 4)
{
Send15();
}
else
{
int task;
DWORD parm;
task=(int)(*pt++); // COMMAND
parm=*pt++; // RPTN(L)
parm+=(((DWORD)*pt++)<<8); // RPTN(H)
parm+=(((DWORD)*pt++)<<16);// FAN/RI
CommTask(0x8F,task,parm);
}
}
//读取采样值
void ReplyCmd90(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 3)
{
Send15();
}
else
{
int task;
DWORD parm;
task=(int)(*pt++); // COMMAND
parm=*pt++; // RI/FAN/RPTN(L)
parm+=(((DWORD)*pt)<<8); // RPTN(H)
CommTask(0x90,task,parm);
}
}
//采样值传输确认
void ReplyCmd91(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 1)
{
Send15();
}
else
{
DWORD parm;
parm=*pt;
CommTask(0x90,19,parm);
}
}
//读取开入量
void ReplyCmd92(BYTE *sBuf,WORD wFrameCounter)
{
DWORD di;
BYTE *cpAck;
cpAck=caAckBuf;
*cpAck++=3+3+5;
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x22;
*cpAck++=3+3;
*cpAck++=RELAY_TYPE_LO;
*cpAck++=RELAY_TYPE_HI;
*cpAck++=DI_NUMBER;
di=_g_dDiValue;
*cpAck++=(BYTE)di;
*cpAck++=(BYTE)(di>>8);
*cpAck++=(BYTE)(di>>16);
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
//读取整定值
void ReplyCmd93(BYTE *sBuf,WORD wFrameCounter)
{
WORD bn;
BYTE *pt;
pt=sBuf+3;
if(*pt != 1)
{
Send15();
}
else
{
pt++;
bn=*pt;
Send23(bn);
}
}
//下发整定值
void ReplyCmd94(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt,*pt1;
int i;
if( !Is_Local( _g_dDiValue ) )
{
Send15();
return;
}
pt=sBuf+3;
if( (*pt++ != SET_NUMBER*3+2) ||
(*pt++ != RELAY_TYPE_LO ) || (*pt++ != RELAY_TYPE_HI ))
{
Send15();
return;
}
pt1=caSetBuf;
for(i=SET_NUMBER*3; i > 0; i--)
{
*pt1++=*pt++;
}
//计算 crc-16
CrcMake( caSetBuf, SET_NUMBER*3 );
//插入定值合理性校验
pt=caAckBuf,pt1=caSetBuf;
*pt++=(BYTE)(SET_NUMBER*3+7);
*pt++=byDst;
*pt++=byCpuN;
*pt++=0x23;
*pt++=(BYTE)(SET_NUMBER*3+2);
*pt++=RELAY_TYPE_LO;
*pt++=RELAY_TYPE_HI;
for(i=SET_NUMBER*3; i > 0; i--)
{
*pt++=*pt1++;
}
tCmd.byCmd=0x94;
tCmd.byStatus=RES_SET_READY;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
//固化整定值
void ReplyCmd95(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt;
int iSec;
if( !Is_Local( _g_dDiValue ) )
{
Send15();
return;
}
if((tCmd.byCmd != 0x94) || (tCmd.byStatus != RES_SET_READY))
{
tCmd.byCmd=0x95;
tCmd.byStatus=RES_SET_CHKFAIL;
Send25(tCmd.byStatus);
return;
}
tCmd.byCmd=0x95;
pt=sBuf+3;
if(*pt != 1)
{
//N!=1,报文格式错误
tCmd.byStatus=RES_CMD_INVALID;
Send25(tCmd.byStatus);
return;
}
pt++;
iSec=*pt;
if (SET_Write_Set(caSetBuf,(BYTE)iSec) == TRUE)
tCmd.byStatus =RES_SET_WROK;
else
tCmd.byStatus =RES_SET_WRFAIL;
Send25(tCmd.byStatus);
}
//96:读取当前运行定值区
void ReplyCmd96(BYTE *sBuf,WORD wFrameCounter)
{
extern TSECTIONINFO tSecInfo;
BYTE *cpAck;
if( g_tSysErr.bErr[EV_SETERR] )
{
Send25(RES_SET_INVALID);
}
else
{
cpAck=caAckBuf;
*cpAck++=6;
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x20;
*cpAck++=1;
*cpAck++=tSecInfo.byCurSec;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
}
//97:查询操作结果
void ReplyCmd97(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt;
pt =sBuf+3;
if(*pt++ != 1)
{
Send15();
}
else if(tCmd.byCmd != *pt)
{
Send16(); //找不到指定操作
}
else
{
Send25(tCmd.byStatus);
}
}
//预发遥控命令
void ReplyCmd98(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt,*cpAck;
pt =sBuf+3;
if( !Is_Local( _g_dDiValue ) )
{
Send15();
return;
}
if(*pt++ != 3)
{
Send15();
return;
}
//记录开出传动命令参数
//返回26报文供主站校验
cpAck =caTmpBuf;
*cpAck++=*pt++;
*cpAck++=*pt++;
*cpAck++=*pt++;
cpAck=caAckBuf;
pt =caTmpBuf;
*cpAck++=8;
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x26;
*cpAck++=3;
*cpAck++=*pt++;
*cpAck++=~*pt++;
*cpAck++=~*pt++;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
//设置通讯命令状态
tCmd.wDelay =0;
tCmd.byCmd =0x98;
tCmd.byStatus =RES_RMT_READY;
}
//99:遥控命令
void ReplyCmd99(BYTE *sBuf,WORD wFrameCounter)
{
extern TSECTIONINFO tSecInfo;
TSECTIONINFO tTempSecInfo;
BYTE *pt,b1,b2,b3;
if( !Is_Local( _g_dDiValue ) )
{
Send15();
return;
}
//校验命令长度
pt=sBuf+3;
if(*pt++ != 3)
{
Send15();
return;
}
//校验命令序列
if((tCmd.byCmd != 0x98) || (tCmd.byStatus != RES_RMT_READY))
{
tCmd.byCmd=0x99;
tCmd.byStatus=RES_RMT_CHKFAIL;
Send25(tCmd.byStatus);
return;
}
tCmd.byCmd=0x99;
//校验命令参数
b1=*pt++;//command
b2=*pt++;//object
b3=*pt++;//code
pt=caTmpBuf;
if((*pt++ != b1) || (*pt++ != (BYTE)~b2) || (*pt != (BYTE)~b3))
{
tCmd.byStatus=RES_RMT_CHKFAIL;
Send25(tCmd.byStatus);
return;
}
//执行相应的遥控命令
switch(b1)
{
case 1: //切换运行定值区
if(b2 > SEC_NUMBER-1) //校验定值区号的合法性
{
tCmd.byStatus=RES_RMT_NUMERR;
Send25(tCmd.byStatus);
return;
}
else if(b3 != 0x5A) //校验操作代码
{
tCmd.byStatus=RES_RMT_CODERR;
Send25(tCmd.byStatus);
return;
}
if (SET_Switch_Zone(b2) == TRUE)
tCmd.byStatus =RES_RMT_OK;
else
tCmd.byStatus =RES_RMT_FAIL;
Send25(tCmd.byStatus);
break;
case 2: //遥控软压板
//校验遥控压板编号的合法性
if((b2 > FUNCTION_CONTROL_NUMBER)|| (b2==0)) //
{
tCmd.byStatus=RES_RMT_NUMERR;
Send25(tCmd.byStatus);
return;
}
else if((b3 != 0x5A) && (b3 != 0xA5)) //校验操作代码 将"||"改为"&&"
{
tCmd.byStatus=RES_RMT_CODERR;
Send25(tCmd.byStatus);
return;
}
// 取当前运行状态
tTempSecInfo =tSecInfo;
if(b3 == 0x5A)
{
// 遥控投压板
tTempSecInfo.dFunctionControl&=~((DWORD)0x1<<(b2-1));
tTempSecInfo.dFunctionControlRev=~(tTempSecInfo.dFunctionControl);
if( !FM_Write_Set_Head((BYTE*)&tTempSecInfo) )
{
tCmd.byStatus=RES_RMT_FAIL;
Send25(tCmd.byStatus);
return;
}
if( !FM_Read_Set_Head( (BYTE*)&tTempSecInfo ) )
{
tCmd.byStatus=RES_RMT_FAIL;
Send25(tCmd.byStatus);
return;
}
}
else
{
// 遥控切压板
tTempSecInfo.dFunctionControl|=(DWORD)0x1 << (b2-1);
tTempSecInfo.dFunctionControlRev=~(tTempSecInfo.dFunctionControl);
if(!FM_Write_Set_Head((BYTE*)&tTempSecInfo))
{
tCmd.byStatus=RES_RMT_FAIL;
Send25(tCmd.byStatus);
return;
}
if( !FM_Read_Set_Head((BYTE*)&tTempSecInfo) )
{
tCmd.byStatus=RES_RMT_FAIL;
Send25(tCmd.byStatus);
return;
}
}
tSecInfo=tTempSecInfo;
tCmd.byStatus=RES_RMT_OK;
Send25(tCmd.byStatus);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -