📄 process.cpp
字号:
GpsSendBuf[3] = 0x0a;
if (MoxaBufWrite(ChNo,(char*)&TxBuf[0],2))
{
int iCount = 0;
while (MoxaBufIqueue(ChNo) < 19 && iCount < 10)
{
iCount++;
Sleep(20);
}
if (iCount == 10) return;
for (int i = 0;i < 24;i++)
RxBuf[i] = 0;
if (MoxaBufRead(ChNo,RxBuf,19))
{
if ( RxBuf[0]=='D' && RxBuf[10] == 'F')
{
::GetLocalTime(&stlocal);
int year = (((RxBuf[6] >> 4) * 10 + (RxBuf[6] & 0x0f)) * 100
+ ((RxBuf[7] >> 4) * 10 + (RxBuf[7] & 0x0f)));
stgps.wYear = year%9999;
stgps.wMonth = ((RxBuf[8]>>4)*10+(RxBuf[8]&0x0f))%13;
stgps.wDay = ((RxBuf[9]>>4)*10+(RxBuf[9]&0x0f))%32;
stgps.wHour = ((RxBuf[1]>>4)*10+(RxBuf[1]&0x0f))%25;
stgps.wMinute= ((RxBuf[2]>>4)*10+(RxBuf[2]&0x0f))%61;
stgps.wSecond= (((RxBuf[3]>>4)*10+(RxBuf[3]&0x0f)) + 1)%61;
stgps.wMilliseconds = ((RxBuf[4]>>4)*100+(RxBuf[4]&0x0f)*10+(RxBuf[5]>>4))%1000;
stgps.wDayOfWeek =stlocal.wDayOfWeek;
if (stgps.wYear >= 2040 || stgps.wYear < 2000 || stgps.wMonth > 12 || stgps.wDay > 31 || stgps.wHour > 24
|| stgps.wMinute > 60 || stgps.wSecond > 60 || stgps.wMilliseconds > 1000)
return;
//Add 2000.1.26.13:52
CTime LocalTime(stlocal);
CTime GpsTime(stgps);
long Temp = LocalTime.GetTime() - GpsTime.GetTime();
//Add 2000.1.26.13:52 当读到的GPS时间与本机时间差过3秒时认为时间不对
if (Start)//第一次不判断即写入
{
if (SetLocalTime(&stgps) == 0)
SetLocalTime(&stgps);
Start = false;
}
else if (abs(Temp) < 3)
{
if (SetLocalTime(&stgps) == 0)
SetLocalTime(&stgps);
Sleep(50);
GetLocalTime(&stlocal);
CTime t1(stlocal);
CTime t2(stgps);
int ttt = t1.GetTime() - t2.GetTime();
if (abs(ttt) > 10)
{
if (SetLocalTime(&stgps) == 0)
SetLocalTime(&stgps);
}
Beep(100,500);
}
freq = (float)((RxBuf[11]>>4)*10+(RxBuf[11]&0x0f)+
(RxBuf[12]>>4)*0.1+(RxBuf[12]&0x0f)*0.01+(RxBuf[13]>>4)*0.001);
for (int i=0;i<SystemCount.RtuNum;i++)
Rtus[i].Freq[0] = freq ;
}
GpsRecBuf[0] = 1;
GpsRecBuf[1] = 19;
for (int i = 0;i < 19;i++)
GpsRecBuf[i + 2] = RxBuf[i];
}
}
return;
}
void ChannelSwitch(int ChNo)
{
BYTE node;
static bool Success = false;
BYTE Temp[1024];
BYTE TxBuf[7],RxBuf[7];
if (NetProcess1.ThisNodeId=='A')
node=0xaa;
else
node=0xbb;
TxBuf[0]=0xeb;
TxBuf[1]=0x90;
TxBuf[2]=0xeb;
TxBuf[3]=0x90;
TxBuf[4]=0xeb;
TxBuf[5]=0x90; //同步码
if (NetProcess1.mainfertid==NetProcess1.ThisNodeId)
{
if (Success)
TxBuf[6]=0xcc;
else
TxBuf[6]=node;
SwitchSendBuf[0] = 1;
SwitchSendBuf[1] = 7;
for (int i = 0;i < 7;i++)
SwitchSendBuf[i + 2] = TxBuf[i];
MoxaBufRead(ChNo,Temp,1024);
if (MoxaBufWrite(ChNo,(char *)&TxBuf[0],7))
{
int iCount = 0;
while (MoxaBufIqueue(ChNo) < 7 && iCount < 10)
{
iCount++;
Sleep(20);
}
if (iCount == 10) return;
if (MoxaBufRead(ChNo,RxBuf,7) == 7)
{
if ((RxBuf[0]==0xeb) && (RxBuf[1]==0x90) &&
(RxBuf[2]==0xeb) && (RxBuf[3]==0x90) &&
(RxBuf[4]==0xeb) && (RxBuf[5]==0x90) && (RxBuf[6]==node))
Success=true;
else
Success=false;
}
}
SwitchRecBuf[0] = 1;
SwitchRecBuf[1] = 7;
for (i = 0;i < 7;i++)
SwitchRecBuf[i + 2] = RxBuf[i];
}
return;
}
void MnRtuProc()//生成SOE EVENT
{
while(1)
{
Sleep(200);
if (bStopFlag)
{
SetEvent(RecSendThread1.g_hEndEventMnRtuProc);
return;
}
for (int i = 0;i < SystemCount.RtuNum ;i++)
{
if (Rtus[i].Flag && (Rtus[i].Protocol == 4 || Rtus[i].Protocol == 5))//zf rtu
{
if (Rtus[i].Protocol == 5)//sczf-1801
{
int DiNum = 0;
for (int j = 0;j < 16 ;j++)//16个槽
{
if (Rtus[i].RRC [j] != 0x11) continue;
DiNum++;
for (int k = 0;k < 4;k++)//每槽分4组
{
BYTE YxValue = 0;
BYTE ChangeFlag = 0;
for (int m = 0;m < 6;m++)//每组6个点
{
int iDian = (DiNum - 1) * 24 + 6 * k + m;
if (Rtus[i].YxValue [iDian] != Rtus[i].YxValueOld [iDian])//有变位
{
YxValue |= ((Rtus[i].YxValue [iDian] & 0x1) << m);
ChangeFlag |= (1 << m);
Rtus[i].YxValueOld [iDian] = Rtus[i].YxValue [iDian];
Rtus[i].YxChangeFlag [iDian] = 1;//通知有异常遥信数据
}
}
if (ChangeFlag)//有SOE
{
SYSTEMTIME st;
GetLocalTime(&st);
Rtus[i].SoeEvent[Rtus[i].SoePtr].SoeTime = st;
Rtus[i].SoeEvent[Rtus[i].SoePtr].YxValue = YxValue;
Rtus[i].SoeEvent[Rtus[i].SoePtr].ChangeFlag = ChangeFlag;
Rtus[i].SoeEvent[Rtus[i].SoePtr].ZuNo = k;
Rtus[i].SoeEvent[Rtus[i].SoePtr].CaoNo = j;
if (Rtus[i].SoePtr++ == 64) Rtus[i].SoePtr = 0;
}
}
}
}
else//CDTZF
{
for (int j =0;j < Rtus[i].YxNum ;j++)
{
if (Rtus[i].YxValue [j] != Rtus[i].YxValueOld [j])//有变位
{
Rtus[i].YxValueOld [j] = Rtus[i].YxValue [j];
Rtus[i].YxChangeFlag [j] = 1;//通知有异常遥信数据
SYSTEMTIME st;
GetLocalTime(&st);
Rtus[i].SoeEvent[Rtus[i].SoePtr].SoeTime = st;
Rtus[i].SoeEvent[Rtus[i].SoePtr].YxState = Rtus[i].YxValue [j];
Rtus[i].SoeEvent[Rtus[i].SoePtr].YxNo = j;
if (Rtus[i].SoePtr++ == 64) Rtus[i].SoePtr = 0;
}
}
}
for (int j = 0;j < Rtus[i].YcNum ;j++)
{
if (fabs(Rtus[i].YcValue [j] - Rtus[i].YcValueOld [j])
< fabs(Rtus[i].YcValue [j] * (Rtus[i].DeadArea / 100.0)))
continue;
Rtus[i].YcValueOld [j] = Rtus[i].YcValue [j];
Rtus[i].YcChangeFlag [j] = 1;
}
}
}
}
}
void MoxaReadProc()
{
BYTE ReadBuffer[REC_BUF_LEN];
int ReadLen,i,j;
while(1)
{
Sleep(100);
if (bStopFlag)
{
SetEvent(RecSendThread1.g_hEndEventMoxaReadProc);
return;
}
for (i=0;i<SystemCount.ChNum; i++)
{
int iComNo = i + 1;
if (!Channels[i].Flag) continue;
if (!sio_iqueue(iComNo)) continue;
int iBufLen = (Channels[i].MoxaStart - Channels[i].MoxaEnd + REC_BUF_LEN -1)%REC_BUF_LEN;
if (iBufLen == 0)
{
iBufLen = REC_BUF_LEN;
Channels[i].MoxaStart = 0;
Channels[i].MoxaEnd = 0;
}
ReadLen = sio_read(iComNo,(char *)&ReadBuffer[0],iBufLen);
if (ReadLen > 0)
{
BYTE * MoxaRecBuf = &Channels[i].MoxaReadBuffer[0];
WORD MoxaEnd = Channels[i].MoxaEnd;
for (j=0;j<ReadLen;j++)
{
MoxaRecBuf[MoxaEnd++] = ReadBuffer[j];
if (MoxaEnd >= REC_BUF_LEN) MoxaEnd = 0;
}
Channels[i].MoxaEnd = MoxaEnd;
}
}
}
}
int MoxaBufRead(int port, BYTE *buf, int len)
{
int ChNo = port;
int MoxaStart = Channels[ChNo].MoxaStart;
int DataLen = (Channels[ChNo].MoxaEnd - Channels[ChNo].MoxaStart + REC_BUF_LEN)%REC_BUF_LEN;
BYTE *MoxaBuf = &Channels[ChNo].MoxaReadBuffer[0];
if (DataLen > len) DataLen = len;
for (int i=0;i<DataLen;i++)
{
buf[i] = MoxaBuf[MoxaStart++];
if (MoxaStart >= REC_BUF_LEN) MoxaStart = 0;
}
Channels[ChNo].MoxaStart = MoxaStart;
return DataLen;
}
int MoxaBufWrite(int port,char *buf,int len)
{
DWORD num = 0;
int iComNo = port + 1;
int iRet = 0;
iRet = sio_write(iComNo,buf,len);
return iRet;
}
int MoxaBufIqueue(int port)
{
return ((Channels[port].MoxaEnd - Channels[port].MoxaStart + REC_BUF_LEN)%REC_BUF_LEN);
}
void ChannelTest(int port)
{
static int iTestCount = 0;
int RtuNo = Channels[port].ChRtuNo[0];
Rtus[RtuNo].bWorking=TRUE;
Channels[port].bWorking=true;
Rtus[RtuNo].bFault = false;
if (iTestCount++ > 10)
{
BYTE *TXBuf= (BYTE*)&Rtus[RtuNo].TXBuf[0];
for (int l=0;l<6;l++) TXBuf[l] = Rtus[RtuNo].SynWord[l+1];
Rtus[RtuNo].TXBufPtr +=6;
Rtus[RtuNo].TXLen=Rtus[RtuNo].TXBufPtr;
Rtus[RtuNo].bSendCanDisp=TRUE;
MoxaBufWrite(port,(char*)&Rtus[RtuNo].TXBuf[0],Rtus[RtuNo].TXBufPtr);
Rtus[RtuNo].TXBufPtr=0;
iTestCount = 0;
}
else
{
int iLen = MoxaBufIqueue(port);
if (iLen < 6)
return;
iTestCount = 11;
Rtus[RtuNo].RecFrameSum += 6;
MoxaBufRead(port,&Rtus[RtuNo].RecBuf[0],iLen);
Rtus[RtuNo].RecBufPtr=iLen;
Rtus[RtuNo].RecLen=iLen;
Rtus[RtuNo].bReceiveCanDisp = TRUE;
for (int i = 0;i < iLen;i++)
{
if (Rtus[RtuNo].RecBuf[i] != Rtus[RtuNo].TXBuf[i])
Rtus[RtuNo].ErrFrameSum += 1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -