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

📄 processdfmeter.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "fert2000.h"
#include "process.h"
#include "fert2000Dlg.h"

extern ADDR *Addr;
int iSetTimeFlag=0;

void SetDFMeterAddr(int iRtuNo,BYTE * Buf,int iLen)
{
	RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
	if(iRtuNo==0)
	{
		Buf[0]=0x99;
		Buf[1]=0x99;
		Buf[2]=0x99;
		Buf[3]=0x99;
		Buf[4]=0x99;
		Buf[5]=0x99;
	}
	else
	{
		Buf[0]=(rtupara->rtuaddr/10 * 16 + rtupara->rtuaddr%10);
		Buf[1]=0x00;
		Buf[2]=0x00;
		Buf[3]=0x00;
		Buf[4]=0x00;
		Buf[5]=0x00;
	}
}

BYTE DFMeter_Check(BYTE * Buf,int iLen)
{
	DWORD Sum=0;
	BYTE  Val=0;
	for(int i=0;i<iLen;i++)
	{
		Sum+=Buf[i];
	}
	Val=(BYTE)(Sum%256);
	return Val;
}

void HandleDFMeterValue(int iDataType,int iRtuNo,BYTE * bBuf,int iLen)
{
	if(iLen<=0) return;
	RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
	int i;
	BYTE Buf[200];
	for(i=0;i<iLen;i++)
		Buf[i] = bBuf[i] - 0x33;
	switch(iDataType)
	{
	case 0://电流(A、B、C三相)
		for(i=0;i<3;i++)
			rtupara->YcValue[i]=(Buf[2*i+1]/16)*1000+(Buf[2*i+1]%16)*100+(Buf[2*i]/16)*10+(Buf[2*i]%16);
		break;
	case 1://电压(A、B、C三相)
		for(i=0;i<3;i++)
			rtupara->YcValue[3+i]=(Buf[2*i+1]/16)*1000+(Buf[2*i+1]%16)*100+(Buf[2*i]/16)*10+(Buf[2*i]%16);
		break;
	case 2://有功(瞬时、A、B、C三相)
		for(i=0;i<4;i++)
			rtupara->YcValue[6+i]=(Buf[3*i+2]/16)*100000+(Buf[3*i+2]%16)*10000+(Buf[3*i+1]/16)*1000+(Buf[3*i+1]%16)*100+(Buf[3*i]/16)*10+(Buf[3*i]%16);
		break;
	case 3://无功(瞬时、A、B、C三相)
		for(i=0;i<4;i++)
			rtupara->YcValue[10+i]=(Buf[2*i+1]/16)*1000+(Buf[2*i+1]%16)*100+(Buf[2*i]/16)*10+(Buf[2*i]%16);
		break;
	case 4://当前正向有功总电能
		rtupara->KwhValue[0]=(Buf[3]/16)*10000000+(Buf[3]%16)*1000000+(Buf[2]/16)*100000+(Buf[2]%16)*10000
			+(Buf[1]/16)*1000+(Buf[1]%16)*100+(Buf[0]/16)*10+(Buf[0]%16);
		break;
    case 5://当前反向有功总电能
		rtupara->KwhValue[1]=(Buf[3]/16)*10000000+(Buf[3]%16)*1000000+(Buf[2]/16)*100000+(Buf[2]%16)*10000
			+(Buf[1]/16)*1000+(Buf[1]%16)*100+(Buf[0]/16)*10+(Buf[0]%16);
		break;
    case 6://当前正向无功总电能
		rtupara->KwhValue[2]=(Buf[3]/16)*10000000+(Buf[3]%16)*1000000+(Buf[2]/16)*100000+(Buf[2]%16)*10000
			+(Buf[1]/16)*1000+(Buf[1]%16)*100+(Buf[0]/16)*10+(Buf[0]%16);
    case 7://当前反向无功总电能
		rtupara->KwhValue[3]=(Buf[3]/16)*10000000+(Buf[3]%16)*1000000+(Buf[2]/16)*100000+(Buf[2]%16)*10000
			+(Buf[1]/16)*1000+(Buf[1]%16)*100+(Buf[0]/16)*10+(Buf[0]%16);
		break;
	case 8://电表运行状态、电网状态(电池电压、A、B、C三相断电、A、B、C三相过压)
		rtupara->YxValue[0]=(Buf[0]&0x04)>>2;
		rtupara->YxValue[1]=Buf[1]&0x01;
        rtupara->YxValue[2]=(Buf[1]&0x02)>>1;
        rtupara->YxValue[3]=(Buf[1]&0x04)>>2;
        rtupara->YxValue[4]=(Buf[1]&0x10)>>4;
		rtupara->YxValue[5]=(Buf[1]&0x20)>>5;
		rtupara->YxValue[6]=(Buf[1]&0x40)>>6;
		break;
	}
}

void DFMeter(int iChNo,int iRtuNo)
{
	int SendLen = 0,RecLen = 0,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];
    for(int i=0;i<4;i++)
		SendBuf[i]=0xfe;
	SendLen=4;
	ChanBufWrite(iChNo,SendBuf,SendLen);
	Sleep(5);
	if(iSetTimeFlag==1)//校时
	{
		iSetTimeFlag=0;
		SendBuf[0]=0x68;
		SetDFMeterAddr(0,&SendBuf[1],6);
		SendBuf[7]=0x68;
		SendBuf[8]=0x08;
		SendBuf[9]=0x06;
		SYSTEMTIME st;
		GetLocalTime(&st);
		SendBuf[10]=(BYTE)(st.wSecond+0x33);
		SendBuf[11]=(BYTE)(st.wMinute+0x33);
		SendBuf[12]=(BYTE)(st.wHour+0x33);
		SendBuf[13]=(BYTE)(st.wDay+0x33);
		SendBuf[14]=(BYTE)(st.wMonth+0x33);
		SendBuf[15]=(BYTE)(st.wYear-2000+0x33);
		SendBuf[16]=DFMeter_Check(SendBuf,16);
		SendBuf[17]=0x16;
		SendLen=18;
		ChanBufRead(iChNo,RecBuf,1024);
		ChanBufWrite(iChNo,SendBuf,SendLen);
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
		Sleep(500);
	}
	else if(rtupara->CommandSendFlag[1]==true)//电流(A、B、C三相)
	{
		rtupara->CommandSendFlag[1]=false;
        SendBuf[0]=0x68;
		SetDFMeterAddr(iRtuNo,&SendBuf[1],6);
		SendBuf[7]=0x68;
        SendBuf[8]=0x01;
		SendBuf[9]=0x02;
		SendBuf[10]=0x2f+0x33;
		SendBuf[11]=0xb6+0x33;
		SendBuf[12]=DFMeter_Check(SendBuf,12);
		SendBuf[13]=0x16;
		SendLen=14;
		ChanBufRead(iChNo,RecBuf,1024);
		ChanBufWrite(iChNo,SendBuf,SendLen);
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
		Sleep(500);
		for(i=0;i<6;i++)
		{
			ChanBufRead(iChNo,RecBuf,1);
			if(RecBuf[0]==0x68)
				break;
		}
		iRet=ChanBufRead(iChNo,&RecBuf[1],9);
		RecLen=iRet+1;
		int iStatus = 2;
		if(RecLen==10 && (RecBuf[0]==SendBuf[0] && RecBuf[1]==SendBuf[1] && RecBuf[2]==SendBuf[2] && RecBuf[3]==SendBuf[3]
			&& RecBuf[4]==SendBuf[4] && RecBuf[5]==SendBuf[5] && RecBuf[6]==SendBuf[6] && RecBuf[7]==SendBuf[7]))
		{
			iRet=ChanBufRead(iChNo,&RecBuf[10],RecBuf[9]+2);
			RecLen+=iRet;
			iStatus = 0;
			HandleDFMeterValue(0,iRtuNo,&RecBuf[12],RecLen-14);
			if (rtupara->bWorking == false)
				ChannelEvent(iRtuNo,2);
			rtupara->bWorking = true;
			rtupara->bFault = false;
			rtupara->AskTimers = 0;
		}
		else
		{
			rtupara->AskTimers++;
			iStatus = 1;
		}
		DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
	}
	else if(rtupara->CommandSendFlag[2]==true)//电压(A、B、C三相)
	{
		rtupara->CommandSendFlag[2]=false;
        SendBuf[0]=0x68;
		SetDFMeterAddr(iRtuNo,&SendBuf[1],6);
		SendBuf[7]=0x68;
        SendBuf[8]=0x01;
		SendBuf[9]=0x02;
		SendBuf[10]=0x1f+0x33;
		SendBuf[11]=0xb6+0x33;
		SendBuf[12]=DFMeter_Check(SendBuf,12);
		SendBuf[13]=0x16;
		SendLen=14;
		ChanBufRead(iChNo,&RecBuf[1],1024);
		ChanBufWrite(iChNo,SendBuf,SendLen);
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
		Sleep(500);
		for(i=0;i<6;i++)
		{
			ChanBufRead(iChNo,RecBuf,1);
			if(RecBuf[0]==0x68)
				break;
		}
		int iStatus = 2;
		iRet=ChanBufRead(iChNo,&RecBuf[1],9);
		RecLen=iRet+1;
		if(RecLen==10 && (RecBuf[0]==SendBuf[0] && RecBuf[1]==SendBuf[1] && RecBuf[2]==SendBuf[2] && RecBuf[3]==SendBuf[3]
			&& RecBuf[4]==SendBuf[4] && RecBuf[5]==SendBuf[5] && RecBuf[6]==SendBuf[6] && RecBuf[7]==SendBuf[7]))
		{
			iRet=ChanBufRead(iChNo,&RecBuf[10],RecBuf[9]+2);
			RecLen+=iRet;
			iStatus = 0;
			HandleDFMeterValue(1,iRtuNo,&RecBuf[12],RecLen-14);
			if (rtupara->bWorking == false)
				ChannelEvent(iRtuNo,2);
			rtupara->bWorking = true;
			rtupara->bFault = false;
			rtupara->AskTimers = 0;
		}
		else 
		{
			iStatus = 1;
			rtupara->AskTimers++;
		}
		DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
	}
	else if(rtupara->CommandSendFlag[3]==true)//有功(瞬时、A、B、C三相)
	{
		rtupara->CommandSendFlag[3]=false;
        SendBuf[0]=0x68;
		SetDFMeterAddr(iRtuNo,&SendBuf[1],6);
		SendBuf[7]=0x68;
        SendBuf[8]=0x01;
		SendBuf[9]=0x02;
		SendBuf[10]=0x3f+0x33;
		SendBuf[11]=0xb6+0x33;
		SendBuf[12]=DFMeter_Check(SendBuf,12);
		SendBuf[13]=0x16;
		SendLen=14;
		ChanBufRead(iChNo,RecBuf,1024);
		ChanBufWrite(iChNo,SendBuf,SendLen);
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
		Sleep(500);
		for(i=0;i<6;i++)
		{
			ChanBufRead(iChNo,RecBuf,1);
			if(RecBuf[0]==0x68)
				break;
		}
		int iStatus = 2;
		iRet=ChanBufRead(iChNo,&RecBuf[1],9);
		RecLen=iRet+1;
		if(RecLen==10 && (RecBuf[0]==SendBuf[0] && RecBuf[1]==SendBuf[1] && RecBuf[2]==SendBuf[2] && RecBuf[3]==SendBuf[3]
			&& RecBuf[4]==SendBuf[4] && RecBuf[5]==SendBuf[5] && RecBuf[6]==SendBuf[6] && RecBuf[7]==SendBuf[7]))
		{
			iRet=ChanBufRead(iChNo,&RecBuf[10],RecBuf[9]+2);
			RecLen+=iRet;
			iStatus = 0;
			HandleDFMeterValue(2,iRtuNo,&RecBuf[12],RecLen-14);
			if (rtupara->bWorking == false)
				ChannelEvent(iRtuNo,2);
			rtupara->bWorking = true;
			rtupara->bFault = false;
			rtupara->AskTimers = 0;
		}
		else 
		{
			iStatus = 1;
			rtupara->AskTimers++;
		}
		DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
	}
	else if(rtupara->CommandSendFlag[4]==true)//无功(瞬时、A、B、C三相)
	{
		rtupara->CommandSendFlag[4]=false;
        SendBuf[0]=0x68;
		SetDFMeterAddr(iRtuNo,&SendBuf[1],6);
		SendBuf[7]=0x68;
        SendBuf[8]=0x01;
		SendBuf[9]=0x02;
		SendBuf[10]=0x4f+0x33;
		SendBuf[11]=0xb6+0x33;
		SendBuf[12]=DFMeter_Check(SendBuf,12);
		SendBuf[13]=0x16;
		SendLen=14;
		ChanBufRead(iChNo,RecBuf,1024);
		ChanBufWrite(iChNo,SendBuf,SendLen);
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
		Sleep(500);

⌨️ 快捷键说明

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