📄 processmeter.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 + -