📄 processdcf.cpp
字号:
{
SYSTEMTIME SysTime;
GetLocalTime(&SysTime);
BYTE *TXBuf= &(Rtus[RtuNo].TXBuf[Rtus[RtuNo].TXBufPtr]);
for (int l=0;l<6;l++) TXBuf[l] = Rtus[RtuNo].SynWord[l+1];
TXBuf[6] = 0x70; TXBuf[7] = 0xd9;
TXBuf[8] = 1; TXBuf[9] = 0x01;
TXBuf[10] = Rtus[RtuNo].Addr;
TXBuf[11] = DCF_CheckCRC(TXBuf+6);
TXBuf[12]=SysTime.wHour / 10 * 16 + SysTime.wHour % 10;
TXBuf[13]=SysTime.wMinute / 10 * 16 + SysTime.wMinute % 10;
TXBuf[14]=SysTime.wSecond / 10 * 16 + SysTime.wSecond % 10;
TXBuf[15]=(SysTime.wMilliseconds / 256) / 10 * 16 + (SysTime.wMilliseconds / 256) % 10;
TXBuf[16]=(SysTime.wMilliseconds % 256) / 10 * 16 + (SysTime.wMilliseconds % 256) % 10;
TXBuf[17] =DCF_CheckCRC(TXBuf+12);
Rtus[RtuNo].TXBufPtr+=18;
Channels[ChNo].ReviseTimeFlag &= 0xfb;
}
// 设定命令
/* if (Channels[ChNo].WorkType == 5)//通道测试
{
if ((Rtus[RtuNo].TXBufPtr<6) && (Channels[ChNo].ReviseTimeFlag & 1))
{
BYTE *TXBuf= (BYTE*)&Rtus[RtuNo].TXBuf[Rtus[RtuNo].TXBufPtr];
for (int l=0;l<6;l++) TXBuf[l] = Rtus[RtuNo].SynWord[l+1];
Rtus[RtuNo].TXBufPtr +=6;
Channels[ChNo].ReviseTimeFlag &= 0xfe;
}
}*/
if (Rtus[RtuNo].TXBufPtr)
{
if (Channels[ChNo].WorkType == 1)
{
Rtus[RtuNo].TXBufPtr = 0;
return;
}
Rtus[RtuNo].TXLen=Rtus[RtuNo].TXBufPtr;
Rtus[RtuNo].bSendCanDisp=TRUE;
MoxaBufWrite(ChNo,(char*)&Rtus[RtuNo].TXBuf[0],Rtus[RtuNo].TXBufPtr);
Rtus[RtuNo].TXBufPtr=0;
}
}
BYTE DCF_CheckCRC(BYTE *pInfoWord)
{
return CDT_CheckCRC(pInfoWord);
}
void DCF_Answer(int ChNo,int RtuNo,int &NonceInfoWord)
{
int i = ChNo;
switch(Rtus[RtuNo].RecBuf[NonceInfoWord])
{
case 0x0://子站时钟
DCF_ReviseTime(i,RtuNo,NonceInfoWord);
break;
case 0xe0://遥控返校
case 0xe1:
case 0xe2:
case 0xe9://升降返校
case 0xea:
case 0xeb:
DCF_YK_SJ_Pro(i,RtuNo,NonceInfoWord);
break;
case 0xdf://子站状态信息,向后台发送RTU STATUS
break;
}
}
void DCF_SOE_Event(int RtuNo,int &NonceInfoWord)
{
WORD MilliSeconds;
FERTEVENT Event;
FERTEVENT *CurEventP;
SYSTEMTIME CurTime;
BYTE *RecBuf = &Rtus[RtuNo].RecBuf[NonceInfoWord];
BYTE *SOEInfo = Rtus[RtuNo].CDT_SOEInfo;
GetLocalTime(&CurTime);
if (RecBuf[11] != CDT_CheckCRC(RecBuf + 6))
{
NonceInfoWord +=6;
return;
}
if ((RecBuf[1] == SOEInfo[0]) && (RecBuf[9] == SOEInfo[1]) && (RecBuf[10] == SOEInfo[2])
&& (RecBuf[7] == SOEInfo[3]) && (RecBuf[8] == SOEInfo[4]) && (RecBuf[4] == SOEInfo[5]))
{
NonceInfoWord += 6;
return;
}
if((Events.EventNum+1)==Events.EventSendNum)
{
Beep(1200,500);
NonceInfoWord += 6;
return;
}
MilliSeconds=((RecBuf[7] & 0xf) %10) * 100 + ((RecBuf[8]>>4)%10)*10 + (RecBuf[8]&0xf)%10;
if (Rtus[RtuNo].TimeForbit == 1)
{
Event.ms = CurTime.wMilliseconds % 100;
Event.hundms = CurTime.wMilliseconds / 100;
Event.seconds = (BYTE)CurTime.wSecond;
Event.minute = (BYTE)CurTime.wMinute;
Event.hour = (BYTE)CurTime.wHour;
}else
{
Event.ms = MilliSeconds % 100;
Event.hundms = MilliSeconds / 100;
Event.seconds = ((RecBuf[4]>>4) % 6) * 10 + (RecBuf[4] & 0xf)%10;
Event.minute = ((RecBuf[3]>>4) % 6) * 10 + (RecBuf[3] & 0xf)%10;
Event.hour = ((RecBuf[2]>>4) % 3) * 10 + (RecBuf[2] & 0xf)%10;
}
Event.day = (BYTE)CurTime.wDay;
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 = RtuNo;
if (RecBuf[9]==0xff) Event.yxno = RecBuf[10];
else Event.yxno = RecBuf[9] + RecBuf[10] * 256;
Event.cause = 1;
Event.type = 1;
Event.state = (RecBuf[1] == 0xcc) ? 1 : 0;
NonceInfoWord += 6;
SOEInfo[0] = RecBuf[1];
SOEInfo[1] = RecBuf[9];
SOEInfo[2] = RecBuf[10];
SOEInfo[3] = RecBuf[7];
SOEInfo[4] = RecBuf[8];
SOEInfo[5] = RecBuf[4];
CurEventP = Events.EventBuf + Events.EventNum;
memcpy(CurEventP,&Event,sizeof(FERTEVENT));
if(++Events.EventNum>=MAX_EVENT_NUM)
Events.EventNum=0;
}
void DCF_YK_SJ_Pro(int i,int RtuNo,int &NonceInfoWord)
{
BYTE *RecBuf = Rtus[RtuNo].RecBuf;
if (RtuNo != *((WORD*)(YKReserved+1))) return;
int iFjYkNo1 = RecBuf[NonceInfoWord + 3] / 16 * 10 + RecBuf[NonceInfoWord + 3] % 16
+ (RecBuf[NonceInfoWord + 4] / 16 * 10 + RecBuf[NonceInfoWord + 4] % 16) * 100;
int iFjYkNo2 = RecBuf[NonceInfoWord + 3 + 6] / 16 * 10 + RecBuf[NonceInfoWord + 3 + 6] % 16
+ (RecBuf[NonceInfoWord + 4 + 6] / 16 * 10 + RecBuf[NonceInfoWord + 4 + 6] % 16) * 100;
int iFjYkNo3 = RecBuf[NonceInfoWord + 3 + 12] / 16 * 10 + RecBuf[NonceInfoWord + 3 + 12] % 16
+ (RecBuf[NonceInfoWord + 4 + 12] / 16 * 10 + RecBuf[NonceInfoWord + 4 + 12] % 16) * 100;
int iYkNo = YKReserved[4] * 256 + YKReserved[3];
if ((RecBuf[NonceInfoWord + 1]==YKReserved[7] || RecBuf[NonceInfoWord + 7]==YKReserved[7] || RecBuf[NonceInfoWord + 13]==YKReserved[7])
&& (iFjYkNo1 == iYkNo || iFjYkNo2 == iYkNo || iFjYkNo3 == iYkNo))
YKEcho[RtuNo][1] = YKReserved[7];
else
{
YKEcho[RtuNo][1] = 0xff;
YKReserved[4] = iFjYkNo1 / 256;
YKReserved[3] = iFjYkNo1 % 256;
}
YKEchoFlag[RtuNo]=1;
NonceInfoWord +=12;
}
void DCF_SetRtuTime(int i,int RtuNo)
{
SYSTEMTIME SysTime;
BYTE SetTimeFrame[18];
BYTE *SetTimeFrameSyn = (BYTE *)SetTimeFrame;
GetLocalTime(&SysTime);
for (int l=0;l<6;l++) SetTimeFrame[l] = Rtus[RtuNo].SynWord[l+1];
SetTimeFrame[6]=0x70;
SetTimeFrame[7]=0xD9;
SetTimeFrame[8]=0x01;
SetTimeFrame[9]=0x01;
SetTimeFrame[10]=Rtus[RtuNo].Addr;
SetTimeFrame[11] =DCF_CheckCRC(&SetTimeFrame[6]);
SetTimeFrame[12]=SysTime.wHour / 10 * 16 + SysTime.wHour % 10;
SetTimeFrame[13]=SysTime.wMinute / 10 * 16 + SysTime.wMinute % 10;
SetTimeFrame[14]=SysTime.wSecond / 10 * 16 + SysTime.wSecond % 10;
SetTimeFrame[15]=(SysTime.wMilliseconds / 256) / 10 * 16 + (SysTime.wMilliseconds / 256) % 10;
SetTimeFrame[16]=(SysTime.wMilliseconds % 256) / 10 * 16 + (SysTime.wMilliseconds % 256) % 10;
SetTimeFrame[17] =DCF_CheckCRC(&SetTimeFrame[12]);
if (Channels[i].WorkType != 1)
{
MoxaBufWrite(i,(char*)SetTimeFrame,18);
}
}
void DCF_ReviseTime(int i,int RtuNo,int NonceInfoWord)//设置时钟校正值
{
BYTE *RecBuf = &Rtus[RtuNo].RecBuf[NonceInfoWord];
if(Rtus[RtuNo].RecBuf[NonceInfoWord] == 0x84)//子站时钟反送
{
GetLocalTime(&Rtus[RtuNo].CDT_CurTime);
Rtus[RtuNo].CDT_ChildTime = RecBuf[1] + RecBuf[2]*256 + RecBuf[3]*1000 + RecBuf[4]*60000;//收到召唤命令的子站时间
}else
{
BYTE ReviseTimeFrame[18];
WORD ReviseTimeWord;
DWORD ChildWaitTime = RecBuf[1] + RecBuf[2]*256 + RecBuf[3]*1000 + RecBuf[4]*60000;//子站等待时间
DWORD CurTime = Rtus[RtuNo].CDT_CurTime.wMilliseconds + Rtus[RtuNo].CDT_CurTime.wSecond * 1000//当前时间
+ Rtus[RtuNo].CDT_CurTime.wMinute * 6000;
DWORD CallUpTime = Rtus[RtuNo].CDT_CallUpSysTime.wMilliseconds + Rtus[RtuNo].CDT_CallUpSysTime.wSecond * 1000
+ Rtus[RtuNo].CDT_CallUpSysTime.wMinute * 6000;//召唤时钟的主站时间
int ReviseTime = (CallUpTime+CurTime-ChildWaitTime)/2 - Rtus[RtuNo].CDT_ChildTime;
for (int l=0;l<6;l++) ReviseTimeFrame[l] = Rtus[RtuNo].SynWord[l+1];
if (ReviseTime<0)
{
ReviseTimeWord = (-ReviseTime) % 32512;// &0x7fff;
ReviseTimeWord ^= 0x7fff;
ReviseTimeWord ++;
ReviseTimeWord |= 0x8000;
}else
ReviseTimeWord = ReviseTime % 32512;// &0X7fff
*((DWORD*)&ReviseTimeFrame[6]) = 0x010b70;
ReviseTimeFrame[10] = Rtus[RtuNo].Addr;
ReviseTimeFrame[11] = DCF_CheckCRC(&ReviseTimeFrame[6]);
ReviseTimeFrame[12] = 0xed;
*((WORD*)&ReviseTimeFrame[13]) = ReviseTimeWord;
*((WORD*)&ReviseTimeFrame[15]) = ReviseTimeWord;
ReviseTimeFrame[17] = DCF_CheckCRC(&ReviseTimeFrame[12]);
if (Channels[i].WorkType != 1)
{
MoxaBufWrite(i,(char *)ReviseTimeFrame,18);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -