📄 processdfmeter.cpp
字号:
#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 + -