⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processwbs.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#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 + -