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

📄 processmlx.cpp

📁 这是一个变电站的监控程序
💻 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 + -