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

📄 processmeter.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 PowerMeter(int iChNo,int iRtuNo)
{
	CString str1;
	int SendLen = 0,RecLen = 0;
	BOOL iRet = 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];
	BYTE ProcBuf[100];
	int iStatus;
	//设表址
	if (rtupara->CommandSendFlag[4]==true)
	{
		rtupara->CommandSendFlag[4]=false;
		SendBuf[0] = 0xbb;
		SendBuf[1] = 0xbb;
		SendBuf[2] = rtupara->rtuaddr ;
		SendBuf[3] = rtupara->rtuaddr ;
		ChanBufRead(iChNo,RecBuf,500);
		ChanBufWrite(iChNo,SendBuf,4);
		DispBufData(iChNo,iRtuNo,0,SendBuf,4,0);
		Sleep(20);
		iRet = ChanBufRead(iChNo,RecBuf,4);
	    iStatus = 2;
		if (iRet == 4)
			iStatus = 0;
		DispBufData(iChNo,iRtuNo,1,RecBuf,iRet,iStatus);
	}
	//瞬时数据打包查询
	SendBuf[0] = rtupara->rtuaddr ;
	SendBuf[1] = 0xb8;
	SendBuf[2] = 0x6d;
	SendBuf[3] = 0xff;
	SendBuf[4] = 0;
	SendBuf[5] = 0;
	SendBuf[6] = Check_Xor(SendBuf,6);
	SendBuf[7] = Check_Add(SendBuf,6) % 256;
	SendBuf[8] = 0x0d;
	ChanBufWrite(iChNo,SendBuf,9);
	DispBufData(iChNo,iRtuNo,0,SendBuf,9,0);
	Sleep(1500);
	iStatus = 2;
	iRet = ChanBufRead(iChNo,RecBuf,74);
	if (iRet == 74 && RecBuf[0] == rtupara->rtuaddr)
	{
		if (Check_Xor(RecBuf,71) == RecBuf[71] && (Check_Add(RecBuf,71) % 256)==RecBuf[72])//校验对
		{
			iStatus  = 0;
			for (int i = 0;i < iRet;i++)
			{
				if (RecBuf[i] > 0x40)
					ProcBuf[i] = RecBuf[i] - 0x37;
				else
					ProcBuf[i] = RecBuf[i] - 0x30;
			}
			long dwTemp1,dwTemp2;
			for (i = 0;i < 2;i++)
			{
				dwTemp1 = ProcBuf[3+i*6]*16+ProcBuf[4+i*6]+(ProcBuf[5+i*6]*16+ProcBuf[6+i*6])*256
					+(ProcBuf[7+i*6]*16+ProcBuf[8+i*6])*256*256;
				if ((dwTemp1 & 0x800000))//负数
					dwTemp2 = -(0xffffff - dwTemp1 + 1);
				else 
					dwTemp2 = dwTemp1;
				rtupara->YcValue [i] = dwTemp2;
			}
			for (i = 0;i < 6;i++)
			{
				dwTemp1 = ProcBuf[15+i*4]*16+ProcBuf[16+i*4]+(ProcBuf[17+i*4]*16+ProcBuf[18+i*4])*256;
				if (dwTemp1 & 0x8000)//负数
					dwTemp2 = -(0xffff - dwTemp1 + 1);
				else 
					dwTemp2 = dwTemp1;
				rtupara->YcValue [i+2] = dwTemp2;
			}
			for (i = 0;i < 4;i++)
			{
				dwTemp1 = ProcBuf[39+i*8]*16+ProcBuf[40+i*8]+(ProcBuf[41+i*8]*16+ProcBuf[42+i*8])*256
						+(ProcBuf[43+i*8]*16+ProcBuf[44+i*8])*256*256+(ProcBuf[45+i*8]*16+ProcBuf[46+i*8])*256*256*256;
				if (dwTemp1 & 0x80000000) //负数
					dwTemp2 = -(0xffffffff - dwTemp1 + 1) ;
				else 
					dwTemp2 = dwTemp1;
				rtupara->KwhValue [i] = dwTemp2;
			}
			if (rtupara->bWorking == false)
				ChannelEvent(iRtuNo,2);
			rtupara->bWorking = true;
			rtupara->bFault = false;
			rtupara->AskTimers = 0;
			goto exit_this;
		}
		else 
			iStatus = 1;
	}
	else
		iStatus = 1;
	if (rtupara->AskTimers > 5)
	{
		rtupara->bWorking = false;
		if (rtupara->bFault == false)
		{
			ChannelEvent(iRtuNo,1);
			rtupara->bFault = true;
		}
		if (rtupara->AskTimers > 250)
			rtupara->AskTimers = 5;
	}
exit_this:
	DispBufData(iChNo,iRtuNo,1,RecBuf,iRet,iStatus);
	return;
}

BYTE Check_Xor(BYTE *buf,int iLen)
{
	BYTE iRet = buf[0];
	for (int i = 1;i < iLen;i++)
		iRet ^= buf[i];
	return iRet;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -