📄 processcdt91rec.cpp
字号:
else if (rtupara->CommandSendFlag[1]==true)//广播
{
rtupara->CommandSendFlag[1]=false;
for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
Sendlen=6;
SendBuf[6]=0x21;
SendBuf[7]=0x9e;
SendBuf[8]=0x00;
SendBuf[9]=0x01;
SendBuf[10]=rtupara->rtuaddr;
SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);
Sendlen+=6;
ChanBufWrite(i,SendBuf,Sendlen);
DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
}
else if (rtupara->CommandSendFlag[2])//召唤子站时钟
{
rtupara->CommandSendFlag[2]=false;
for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
Sendlen=6;
SendBuf[6]=0x31;
SendBuf[7]=0x4c;
SendBuf[8]=0x00;
SendBuf[9]=0x01;
SendBuf[10]=rtupara->rtuaddr;
SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);
Sendlen+=6;
ChanBufWrite(i,SendBuf,Sendlen);
DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
}
else if (rtupara->CommandSendFlag[5])//复归命令
{
rtupara->CommandSendFlag[5]=false;
for (int l=0;l<6;l++) SendBuf[l]= bSynWord[l];
Sendlen=6;
SendBuf[6]=0x31;
SendBuf[7]=0x3d;
SendBuf[8]=0x00;
SendBuf[9]=0x01;
SendBuf[10]=rtupara->rtuaddr;
SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);
Sendlen+=6;
ChanBufWrite(i,SendBuf,Sendlen);
DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
}
else if (rtupara->CommandSendFlag[7]==true)//设置时钟
{
rtupara->CommandSendFlag[7]=false;
for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
Sendlen=6;
SYSTEMTIME SysTime;
GetLocalTime(&SysTime);
SendBuf[6]=0x71;
SendBuf[7]=0x7a;
SendBuf[8]=0x02;
SendBuf[9]=0x01;
SendBuf[10]=rtupara->rtuaddr;
SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);
SendBuf[12]=0xee;
SendBuf[13]=SysTime.wMilliseconds%256;
SendBuf[14]=SysTime.wMilliseconds/256 & 0x03;
SendBuf[15]=(BYTE)SysTime.wSecond & 0x3f;
SendBuf[16]=(BYTE)SysTime.wMinute & 0x3f;
SendBuf[17]=CDT_CheckCRC(&SendBuf[12]);
SendBuf[18]=0xef;
SendBuf[19]=(BYTE)SysTime.wHour & 0x1f;
SendBuf[20]=(BYTE)SysTime.wDay & 0x1f;
SendBuf[21]=(BYTE)SysTime.wMonth & 0xf;
SendBuf[22]=SysTime.wYear%100;
SendBuf[23]=CDT_CheckCRC(&SendBuf[18]);
Sendlen+=18;
ChanBufWrite(i,SendBuf,Sendlen);
DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
}
/* else
{
for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
Sendlen=6;
ChanBufWrite(i,SendBuf,Sendlen);
DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
}*/
}
void CDT91Rec_Answer(int i,int iRtuNo,int & NonceInfoWord)
{
CHANPARA *chanpara = Addr->ChanPara_addr + i;
RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
if (rtupara == NULL) return;
BYTE* RecBuf=&(chanpara->ProcBuffer[0]);
BYTE *SendBuf = & chanpara->SendBuffer[0];
switch(RecBuf[NonceInfoWord])
{
case 0x80://0x81 SOE
CDT91_SOE_Event(i,iRtuNo,NonceInfoWord);
break;
case 0x84:
case 0x85://设置时钟校正值
// CDT91Rec_ReviseTime(i,iRtuNo,NonceInfoWord);
break;
case 0xe1:
case 0xe5://遥控,升降返校
CDT91Rec_YK_SJ_Pro(i,iRtuNo,NonceInfoWord);
break;
case 0xec://子站状态信息
{
int iStatus=3;
DWORD YxWord=*(DWORD*)&RecBuf[NonceInfoWord+1];
BYTE State=0;
/* for (int k=0;k<32;k++)
{
State = (YxWord & (1<<k)) ? 1 : 0;
if (rtupara->YxValue[k] != State)
rtupara->YxValue[k] = State;
}*/
if(RecBuf[NonceInfoWord+1]&0x80)
{
for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
int Sendlen=6;
SYSTEMTIME SysTime;
GetLocalTime(&SysTime);
SendBuf[6]=0x71;
SendBuf[7]=0x7a;
SendBuf[8]=0x02;
SendBuf[9]=0x01;
SendBuf[10]=rtupara->rtuaddr;
SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);
SendBuf[12]=0xee;
SendBuf[13]=SysTime.wMilliseconds%256;
SendBuf[14]=SysTime.wMilliseconds/256 & 0x03;
SendBuf[15]=(BYTE)SysTime.wSecond & 0x3f;
SendBuf[16]=(BYTE)SysTime.wMinute & 0x3f;
SendBuf[17]=CDT_CheckCRC(&SendBuf[12]);
SendBuf[18]=0xef;
SendBuf[19]=(BYTE)SysTime.wHour & 0x1f;
SendBuf[20]=(BYTE)SysTime.wDay & 0x1f;
SendBuf[21]=(BYTE)SysTime.wMonth & 0xf;
SendBuf[22]=SysTime.wYear%100;
SendBuf[23]=CDT_CheckCRC(&SendBuf[18]);
Sendlen+=18;
ChanBufWrite(i,SendBuf,Sendlen);
DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
}
break;
}
}
}
void CDT91_SOE_Event(int i,int iRtuNo,int &NonceInfoWord)
{
STATION * station = Addr->Station_addr;
CHANPARA *chanpara = Addr->ChanPara_addr + i;
RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
if (rtupara == NULL) return;
BYTE* RecBuf=&(chanpara->ProcBuffer[NonceInfoWord]);
NonceInfoWord += 30;
if (RecBuf[11] == CDT_CheckCRC(RecBuf + 6))
{
WORD MilliSeconds;
FERTEVENT Event;
SYSTEMTIME CurTime;
GetLocalTime(&CurTime);
MilliSeconds=RecBuf[1] + (RecBuf[2] & 0x03)*256;
Event.ms = MilliSeconds % 100;
Event.hundms = MilliSeconds / 100;
Event.seconds = RecBuf[3] & 0x3f;
Event.minute = RecBuf[4] & 0x3f;
Event.hour = RecBuf[7] & 0x1f;
Event.day = RecBuf[8] & 0x1f;
Event.month = (BYTE)CurTime.wMonth;
Event.year = CurTime.wYear;
Event.Recms = CurTime.wMilliseconds % 100;
Event.Rechundms = CurTime.wMilliseconds/100;
Event.Recseconds = (BYTE)CurTime.wSecond;
Event.Recminute = (BYTE)CurTime.wMinute;
Event.Rechour = (BYTE)CurTime.wHour;
Event.Recday = (BYTE)CurTime.wDay;
Event.rtuno = iRtuNo;
Event.yxno = RecBuf[9] + (RecBuf[10] & 0xf)*256;
Event.cause = 1;
Event.type = 1;
Event.state = (RecBuf[10] & 0x80) ? 1 : 0;
GenRtuEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,&Event);//产生SOE报警
STATION *station = Addr->Station_addr;
for (int k = 0;k < station->yxnum;k++)
{
YXPARA *yxpara = Addr->YxPara_addr + k;
if (!yxpara->validf)
continue;
if (yxpara->rtuno == iRtuNo && yxpara->yxno == Event.yxno)
break;
}
if (k == station->yxnum)
return;
int iRealYxNo = k;
for (k = 0;k < station->zyxnum;k++)
{
ZFYXPARA *zfyxpara = Addr->ZfYxPara_addr + k;
if (!zfyxpara->validf)
continue;
CString str1 = zfyxpara->yxname;
WORD tYxNo = (WORD)atoi(str1.Right(5));
if (tYxNo == iRealYxNo)
break;
}
if (k == station->zyxnum)
return;
for (int j = 0;j < station->channum ;j++)
{
CHANPARA *chanpara = Addr->ChanPara_addr + j;
if (chanpara->useflag && chanpara->openflag && chanpara->updown == 0)
{
chanpara->SoeEvent[chanpara->SoePtr].YxNo = k;
chanpara->SoeEvent[chanpara->SoePtr].YxState = (Event.state & 0x1);
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wYear = Event.year ;
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wMonth = Event.month ;
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wDay = Event.day ;
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wHour = Event.hour ;
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wMinute = Event.minute ;
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wSecond = Event.seconds;
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wMilliseconds = Event.hundms * 100 + Event.ms;
chanpara->SoePtr = (chanpara->SoePtr+1) % 100;
chanpara->bYxChange = true;
chanpara->bYxwChange[k/32] = true;
chanpara->bSoe = true;
}
}
}
}
void CDT91Rec_YK_SJ_Pro(int i,int iRtuNo,int & NonceInfoWord)
{
STATION * station = Addr->Station_addr;
CHANPARA *chanpara = Addr->ChanPara_addr + i;
RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
if (rtupara == NULL) return;
BYTE* RecBuf=&(chanpara->ProcBuffer[0]);
if ((RecBuf[NonceInfoWord+1]==RecBuf[NonceInfoWord+3]) && (RecBuf[NonceInfoWord+1]==rtupara->SetCommand[4])
&& (RecBuf[NonceInfoWord+1]!=0xff))
{
rtupara->SetCommand[5] = 1;//成功返回
if (rtupara->SetCommand[1] == YK)
GenYkEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,0x44,
rtupara->SetCommand[4],rtupara->SetCommand[7]+rtupara->SetCommand[8]*256,rtupara->SetCommand[0]);//fj
else if (rtupara->SetCommand[1] == YT)
GenYtEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,0x44,
rtupara->SetCommand[4],rtupara->SetCommand[7]+rtupara->SetCommand[8]*256,rtupara->SetCommand[0]);//fj
if (rtupara->SetCommand[0] == 0)
{
//yk/yt fj right flag set chanpara bykflag to 0xcc/0x33
for (int k = 0;k < station->channum ;k++)
{
CHANPARA *para = Addr->ChanPara_addr + k;
if (para->useflag && para->openflag && para->updown == 0)
{
if (Addr->YkReserved_addr[3*k] == iRtuNo)
{
Addr->YkReturn_addr[3*k] = iRtuNo;//SCADA 给 Mmview 发消息用
para->bYkfj = true;
}
}
}
}
}
else//FF 出错
rtupara->SetCommand[5]=0;
rtupara->SetCommand[1] = 255;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -