📄 processwbs.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;
extern BYTE bytCurrentYkNodeNo;
extern bool bWfPassed;
////////////////////////////////////////////////////////
WORD Check_Add(BYTE *buf,int iLen)
{
WORD wSum = 0;
for (int i = 0;i < iLen;i++)
{
wSum += buf[i];
}
return wSum;
}
void Wbs(int iChNo,int iRtuNo)
{
CString str1;
int iStatus = 2;
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->rtuaddr == 31 && rtupara->rtutype == 3
&& (rtupara->CommandSendFlag [18] == 1 || rtupara->CommandSendFlag [19] == 1))
{
SendBuf[6] = 0x55;
SendBuf[7] = 0x04;
if (rtupara->CommandSendFlag [18] == 1)
{
rtupara->CommandSendFlag [18] = 0;
SendBuf[8] = 0xcc;
}
else if (rtupara->CommandSendFlag [19] == 1)
{
rtupara->CommandSendFlag [19] = 0;
SendBuf[8] = 0x33;
}
SendBuf[9] = 1;
SendBuf[10] = Check_Add(&SendBuf[6],4) % 256;
SendBuf[11] = Check_Add(&SendBuf[6],4) / 256;
SendBuf[12] = 0x03;
SendLen = 13;
ChanBufRead(iChNo,RecBuf,1024);
ChanBufWrite(iChNo,SendBuf,SendLen);
DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
Sleep(100);
iRet = ChanBufRead(iChNo,RecBuf,7);
RecLen = iRet;
int iStatus = 2;
if (iRet == 7)
{
if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 && RecBuf[4]==0x02 )
{
if (RecBuf[5]==SendBuf[5] && RecBuf[6] == SendBuf[6])
{
iRet = ChanBufRead(iChNo,&RecBuf[7],6);
RecLen += iRet;
if (iRet == 6)
{
if (RecBuf[7]==SendBuf[7] && RecBuf[8]==SendBuf[8] && RecBuf[9]==SendBuf[9]
&& RecBuf[10]==SendBuf[10] && RecBuf[11]==SendBuf[11])//ok
{
SendBuf[6] = 0x06;//ack 置正确标志
iStatus = 0;
}
else
iStatus = 1;
}
else
iStatus = 1;
}
else
iStatus = 1;
}
else
iStatus = 1;
}
DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
SendLen = 7;
ChanBufWrite(iChNo,SendBuf,7);
DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
}
else if (rtupara->CommandSendFlag[7] == true)
{
rtupara->CommandSendFlag[7] = false;
rtupara->CommandSendFlag[1] = true;
if (rtupara->SetCommand[1] == CHECKTIME)
{
FERTEVENT event;
event.cause = 7;
event.type = rtupara->SetCommand[0];
event.state = 0;
event.rtuno = rtupara->rtuno;
GenCommonEvent(&event);
}
SYSTEMTIME st;
GetLocalTime(&st);
SendBuf[6] = 0x04;
SendBuf[7] = 0x0b;
SendBuf[8] = st.wYear % 256;
SendBuf[9] = st.wYear / 256;
SendBuf[10] = (BYTE)st.wMonth;
SendBuf[11] = (BYTE)st.wDay;
SendBuf[12] = (BYTE)st.wHour;
SendBuf[13] = (BYTE)st.wMinute;
SendBuf[14] = (BYTE)st.wSecond;
SendBuf[15] = st.wMilliseconds % 256;
SendBuf[16] = st.wMilliseconds / 256;
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);
// Sleep(200);
DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
}
else if (rtupara->CommandSendFlag[8] == true || rtupara->CommandSendFlag[9])//还需和遥控操作位对应
{
bytCurrentYkNodeNo = rtupara->rtuno;
if (rtupara->CommandSendFlag[8] == true)
{
if ((station->havecenterunit & 0x2) != 0 && !bWfPassed)
{
rtupara->CommandSendFlag[8] = false;
SendDataToWf(rtupara->rtuno,0);
return;
}
bWfPassed = false;
rtupara->CommandSendFlag[8] = false;
if (rtupara->SetCommand[1] != YK) return;
}
else
{
if ((station->havecenterunit & 0x2) != 0 && !bWfPassed)
{
rtupara->CommandSendFlag[9] = false;
SendDataToWf(rtupara->rtuno,0);
return;
}
bWfPassed = false;
rtupara->CommandSendFlag[9] = false;
if (rtupara->SetCommand[1] != YT) return;
}
SendBuf[6] = 0x55;
SendBuf[7] = 0x04;
SendBuf[8] = (rtupara->SetCommand[4] ^ 0xff);//合0x33/分0xcc,这里和CDT91规约正好相反,注意
SendBuf[9] = rtupara->SetCommand[0];//远方/0x1就地
SendBuf[10] = Check_Add(&SendBuf[6],4) % 256;
SendBuf[11] = Check_Add(&SendBuf[6],4) / 256;
SendBuf[12] = 0x03;
SendLen = 13;
ChanBufRead(iChNo,RecBuf,1024);
ChanBufWrite(iChNo,SendBuf,SendLen);
DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
Sleep(100);
iRet = ChanBufRead(iChNo,RecBuf,7);
RecLen = iRet;
int iStatus = 2;
if (iRet == 7)
{
if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 && RecBuf[4]==0x02 )
{
if (RecBuf[5]==SendBuf[5] && RecBuf[6] == SendBuf[6])
{
iRet = ChanBufRead(iChNo,&RecBuf[7],6);
// Sleep(100);//
RecLen += iRet;
if (iRet == 6)
{
if (RecBuf[7]==SendBuf[7] && RecBuf[8]==SendBuf[8] && RecBuf[9]==SendBuf[9]
&& RecBuf[10]==SendBuf[10] && RecBuf[11]==SendBuf[11])//ok
{
if (rtupara->SetCommand[2] == 0x11)//select
{
rtupara->SetCommand[5] = 1;//成功返回
SendBuf[6] = 0x15;
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
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 if (rtupara->SetCommand[2] == 0x22)//execute
{
SendBuf[6] = 0x06;//ack 置正确标志
rtupara->SetCommand[5] = 1;
//yk right yk-execute
}
else
{
rtupara->SetCommand[5] = 0;
SendBuf[6] = 0x15;
}
iStatus = 0;
goto exit_c8;
}
else
iStatus = 1;
}
else
iStatus = 1;
}
else
iStatus = 1;
}
else
iStatus = 1;
}
SendBuf[6] = 0x15;//nak
//gen event yk fj error
if (rtupara->SetCommand[2] == 0x11)//select
{
rtupara->SetCommand[5] = 0;
if (rtupara->SetCommand[1] == YK)
GenYkEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,0x44,
0xff,rtupara->SetCommand[7]+rtupara->SetCommand[8]*256,rtupara->SetCommand[0]);//fj
else
GenYtEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,0x44,
0xff,rtupara->SetCommand[7]+rtupara->SetCommand[8]*256,rtupara->SetCommand[0]);//fj
if (rtupara->SetCommand[0] == 0)
{
//yk fj bad 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] = (char)255;
para->bYkfj = true;
}
}
}
}
}
exit_c8:
SetEvent(RecSendThread1.g_hYKSCADAToMMIEvent);
DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
SendLen = 7;
ChanBufWrite(iChNo,SendBuf,7);
DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
rtupara->SetCommand[1] = 255;
}
else if (rtupara->CommandSendFlag[6] == true)//修改定值
{
// if (rtupara->AskTimers >= 3) return;
rtupara->CommandSendFlag[6] = false;
if (rtupara->SetCommand[1] != MODPROT) return;
FERTEVENT event;
event.cause = 9;
event.type = 1;
event.state = 0;
event.rtuno = rtupara->rtuno;
GenCommonEvent(&event);
SendBuf[6] = 0x54;
SendBuf[7] = 2 + rtupara->pronum * 3;
for (int j = 0;j < rtupara->pronum;j++)
{
SendBuf[8 + 3 * j] = j;
SendBuf[8 + 3 * j + 1] = (int)(rtupara->ProValue [j] / rtupara->ProXiaoShu[j]) % 256;
SendBuf[8 + 3 * j + 2] = (int)(rtupara->ProValue [j] / rtupara->ProXiaoShu[j]) / 256;
}
SendBuf[8 + 3 * rtupara->pronum ] = Check_Add(&SendBuf[6],SendBuf[7]) % 256;
SendBuf[8 + 3 * rtupara->pronum + 1] = Check_Add(&SendBuf[6],SendBuf[7]) / 256;
SendBuf[8 + 3 * rtupara->pronum + 2] = 0x3;
ChanBufWrite(iChNo,SendBuf,6 + rtupara->pronum * 3 + 5);
DispBufData(iChNo,iRtuNo,0,SendBuf,6 + rtupara->pronum * 3 + 5,0);
Sleep(1000);
iRet = ChanBufRead(iChNo,RecBuf,7);
Sleep(100);
RecLen = iRet;
int iStatus = 2;
if (iRet == 7)
{
if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90
&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x54)
{
iRet = ChanBufRead(iChNo,&RecBuf[7],1);
RecLen += iRet;
if (iRet == 1)
{
int iLen = RecBuf[7] -2 + 3;
iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);
// Sleep(100);//
RecLen += iLen;
if (iRet == iLen)
{
if (SendBuf[8+3*rtupara->pronum] == RecBuf[6 + RecBuf[7]] &&
SendBuf[8+3*rtupara->pronum+1] == RecBuf[6 + RecBuf[7] + 1])
{
SendBuf[6] = 0x06;
//gen event protect value modify ok
FERTEVENT event;
event.cause = 9;
event.type = 1;
event.state = 2;
event.rtuno = rtupara->rtuno;
GenCommonEvent(&event);
iStatus = 0;
goto exit_c6;
}
else
iStatus = 1;
}
iStatus = 1;
}
}
else
iStatus = 1;
}
//gen event modify ptotect value bad
event.cause = 9;
event.type = 1;
event.state = 1;
event.rtuno = rtupara->rtuno;
GenCommonEvent(&event);
SendBuf[6] = 0x15;
exit_c6:
DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
ChanBufWrite(iChNo,SendBuf,7);
DispBufData(iChNo,iRtuNo,0,SendBuf,7,0);
rtupara->SetCommand[1] = 255;
}
else if (rtupara->CommandSendFlag[5] == true)//复归
{
rtupara->CommandSendFlag[5] = false;
if (rtupara->SetCommand[1] == RESET)
{
FERTEVENT event;
event.cause = 6;
event.type = rtupara->SetCommand[0];
event.state = 0;
event.rtuno = rtupara->rtuno;
GenCommonEvent(&event);
}
SendBuf[6] = 0x4f;
ChanBufRead(iChNo,RecBuf,1024);
BOOL iRet = ChanBufWrite(iChNo,SendBuf,7);;
SendLen = 7;
DispBufData(iChNo,iRtuNo,0,SendBuf,7,0);
Sleep(100);
iRet = ChanBufRead(iChNo,RecBuf,7);
RecLen = iRet;
if (iRet == 7)
{
if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90
&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x06)//ack
{
//gen event fu gui ok
if (rtupara->SetCommand[1] == RESET)
{
FERTEVENT event;
event.cause = 6;
event.type = rtupara->SetCommand[0];
event.state = 2;
event.rtuno = rtupara->rtuno;
GenCommonEvent(&event);
}
iStatus = 0;
goto exit_c5;
}
else if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90
&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x40)//evnet
{
//gen event fu gui ok
if (rtupara->SetCommand[1] == RESET)
{
FERTEVENT event;
event.cause = 6;
event.type = rtupara->SetCommand[0];
event.state = 2;
event.rtuno = rtupara->rtuno;
GenCommonEvent(&event);
}
iRet = ChanBufRead(iChNo,&RecBuf[7],1);
if (iRet == 1)
{
RecLen += 1;
int iLen =RecBuf[7]-2+3;
iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);
// Sleep(100);//
RecLen += iRet;
if (iRet == iLen)
{
if (HandleRtuEvent(iChNo,iRtuNo,&RecBuf[6],RecBuf[7]+3) == true)//??
iStatus = 0;
else
iStatus = 1;
}
else
iStatus = 1;
}
SendBuf[6] = 0x06;
ChanBufWrite(iChNo,SendBuf,7);
DispBufData(iChNo,iRtuNo,0,SendBuf,7,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -