📄 processmlx.cpp
字号:
#include "stdafx.h"
#include "fert2000.h"
#include "process.h"
#include "math.h"
#include "fert2000Dlg.h"
extern bool bStopFlag;
extern RecSendThread RecSendThread1;
extern CFert2000App theApp;
extern CFert2000Dlg *MainDlg;
extern ADDR *Addr;
//////////////////////////////////////////////
void MlxSelectLine(int iChNo,int iRtuNo)
{
CString str1;
int SendLen = 0,RecLen = 0;
BOOL iRet = 0;
DWORD num = 0;
STATION *station = Addr->Station_addr;
CHANPARA *chanpara = Addr->ChanPara_addr + iChNo;
RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
if (!rtupara) return;
BYTE *SendBuf = &chanpara->SendBuffer[0];
BYTE *RecBuf = &chanpara->RecBuffer[0];
chanpara->Start = 0;
chanpara->End = 0;
SendBuf[0] = 0xeb;
SendBuf[1] = 0x90;
SendBuf[2] = 0xeb;
SendBuf[3] = 0x90;
SendBuf[4] = 0x02;
SendBuf[5] = rtupara->rtuaddr;
if(rtupara->CommandSendFlag[7]==true)//校时命令
{
rtupara->CommandSendFlag[7]=false;
SYSTEMTIME st;
GetLocalTime(&st);
SendBuf[6] = 0x04;
SendBuf[7] = 0x0b;
BYTE T1=st.wYear%100;
BYTE T2=st.wYear/100;
SendBuf[8] =T1/10*16+T1%10;
SendBuf[9] =T2/10*16+T2%10;
T1=st.wMonth%10;
T2=st.wMonth/10;
SendBuf[10] = st.wMonth/10*16+st.wMonth%10;
SendBuf[11] = st.wDay/10*16+st.wDay%10;
SendBuf[12] = st.wHour/10*16+st.wHour%10;
SendBuf[13] = st.wMinute/10*16+st.wMinute%10;
SendBuf[14] = st.wSecond/10*16+st.wSecond%10;
T1=st.wMilliseconds%100;
T2=st.wMilliseconds/100;
SendBuf[15] =T1/10*16+T1%10;
SendBuf[16] =T2/10*16+T2%10;
SendBuf[17] = Check_Add(&SendBuf[6],11) % 256;
SendBuf[18] = Check_Add(&SendBuf[6],11) / 256;
SendBuf[19] = 0x03;
SendLen = 20;
ChanBufWrite(iChNo,SendBuf,SendLen);
DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
Sleep(200);
}
SendBuf[6] = 0x48;//查询
SendBuf[7] = 0x03;
ChanBufRead(iChNo,RecBuf,1024);
iRet = ChanBufWrite(iChNo,SendBuf,8);
SendLen = 8;
DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
Sleep(100);
iRet = ChanBufRead(iChNo,RecBuf,11);
RecLen = iRet;
int iStatus = 2;
if (iRet == 11)
{
if (RecBuf[3]==0xeb && RecBuf[4]==0x90 && RecBuf[5]==0xeb && RecBuf[6]==0x90
&& RecBuf[7]==0x02 && RecBuf[8]==rtupara->rtuaddr && RecBuf[9] == 0x06)//ack
{
rtupara->CommandSendFlag[1] = false;
if (rtupara->bWorking == false)
ChannelEvent(iRtuNo,2);
rtupara->bWorking = true;
rtupara->bFault = false;
rtupara->AskTimers = 0;
iStatus = 0;
// DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen);
}
else if(RecBuf[3]==0xeb && RecBuf[4]==0x90 && RecBuf[5]==0xeb && RecBuf[6]==0x90
&& RecBuf[7]==0x02 && RecBuf[8]==rtupara->rtuaddr&& RecBuf[9] == 0x51)
{
int iLen =RecBuf[10]-2+3;
Sleep(10);
iRet = ChanBufRead(iChNo,&RecBuf[11],iLen);
RecLen += iRet;
if (iRet == iLen && RecBuf[22]== Check_Add(&RecBuf[9],13) % 256 && Check_Add(&RecBuf[9],13) / 256)
{
switch (RecBuf[18])
{
case 0x00:
rtupara->YxValue[0]=1;
case 0x01:
rtupara->YxValue[1]=1;
case 0x02:
rtupara->YxValue[2]=1;
case 0x03:
rtupara->YxValue[3]=1;
}
}
if (rtupara->bWorking == false)
ChannelEvent(iRtuNo,2);
rtupara->bWorking = true;
rtupara->bFault = false;
rtupara->AskTimers = 0;
iStatus = 0;
// DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen);
}
else if(RecBuf[3]==0xeb && RecBuf[4]==0x90 && RecBuf[5]==0xeb && RecBuf[6]==0x90
&& RecBuf[7]==0x02 && RecBuf[8]==rtupara->rtuaddr && RecBuf[9] == 0x40)
{
int iLen =RecBuf[10]-2+3;
iRet = ChanBufRead(iChNo,&RecBuf[11],iLen);
RecLen += iRet;
if (iRet == iLen && RecBuf[28]== Check_Add(&RecBuf[9],19) % 256 && RecBuf[29]== Check_Add(&RecBuf[9],19) / 256)
{
int static Num=0;
if(RecBuf[23]!=0x00)
{
Num=RecBuf[23]-0x63+4;//从数组中第五个元素开始,YxValue[4]代表第1#母线接地
rtupara->YxValue[Num]=1;
}
else
rtupara->YxValue[Num]=0;
}
SendBuf[6] = 0x06;
SendBuf[7] = 0x03;
ChanBufWrite(iChNo,SendBuf,8);
DispBufData(iChNo,iRtuNo,0,SendBuf,8,0);
Sleep(200);
if (rtupara->bWorking == false)
ChannelEvent(iRtuNo,2);
rtupara->bWorking = true;
rtupara->bFault = false;
rtupara->AskTimers = 0;
iStatus = 0;
// DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
}
else
{
rtupara->AskTimers++;
iStatus = 1;
}
}
else
{
iStatus = 1;
rtupara->AskTimers++;
}
DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
if (RecBuf[9] == 0x40 || RecBuf[9] == 0x51)//收到遥信报文
{
if (rtupara->RecFullYx == 255)
rtupara->RecFullYx = 0;
else if (rtupara->RecFullYx == 0)
rtupara->RecFullYx = 1;
}
if (rtupara->AskTimers > 100)// > 10 chan err
{
if (rtupara->bFault == false)
{
ChannelEvent(iRtuNo,1);
rtupara->bFault = true;
}
rtupara->bWorking = false;
rtupara->state = 1;
//置节点通讯异常
if (rtupara->AskTimers > 250)
{
rtupara->AskTimers = 100;
}
}
else
{
rtupara->bWorking = true;
rtupara->state = 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -