📄 metergb.cpp
字号:
// MeterGB.cpp: implementation of the CMeterGB class.
//
//////////////////////////////////////////////////////////////////////
#include "MPGB.h"
#include "MeterGB.h"
#include "stdio.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMeterGB::CMeterGB()
{
// printf("\r\nCMeterGB()");
pMPBase = new CMPGB();
}
CMeterGB::CMeterGB( METERPARA meter)
{
// printf("\r\nCMeterGB( METERPARA meter)");
pMPBase = new CMPGB();
memcpy(&m_meter,&meter,sizeof(METERPARA));
}
CMeterGB::~CMeterGB()
{
}
int CMeterGB::OnReadAllItems(int m_mask)
{
int i;
// time_t m_time,m_time1;
// time( &m_time );
if(m_mask & 0x01)
{
i = OnReadEnergy( );
#ifdef DBUG_PRO
if( i == 0)
{
printf("\r\n采集电表%d电量数据 ---- OK!!!",m_meter.No);
}
else
{
printf("\r\n采集电表%d电量数据 ---- FALL!!!",m_meter.No);
}
#endif
}
if(m_mask & 0x02)
{
i = OnReadPVC();
#ifdef DBUG_PRO
if( i == 0)
{
printf("\r\n采集电表%d瞬时量数据 ---- OK!!!",m_meter.No);
}
else
{
printf("\r\n采集电表%d瞬时量数据 ---- FALL!!!",m_meter.No);
}
#endif
}
if(m_mask & 0x04)
{
i = OnReadMD( );
#ifdef DBUG_PRO
if( i == 0)
{
printf("\r\n采集电表%d需量数据 ---- OK!!!",m_meter.No);
}
else
{
printf("\r\n采集电表%d需量数据 ---- FALL!!!",m_meter.No);
}
#endif
}
if(m_mask & 0x08 == 0x08)
{
i = OnReadEvent();
#ifdef DBUG_PRO
if( i == 0)
{
printf("\r\n采集电表%d电表事件数据 ---- OK!!!",m_meter.No);
}
else
{
printf("\r\n采集电表%d电表事件数据 ---- FALL!!!",i);
}
#endif
}
// printf("\r\nmask:%02x",m_mask);
if((m_mask & 0x10) == 0x10)
{
i = OnReadOther();
#ifdef DBUG_PRO
if( i == 0)
{
printf("\r\n采集电表%d其他数据 ---- OK!!!",m_meter.No);
}
else
{
printf("\r\n采集电表%d其他数据 ---- FALL!!!",m_meter.No);
}
#endif
}
// printf("\r\n USED TIME %d",m_time1 - m_time);
return 0;
}
int CMeterGB::OnReadEnergy( )
{
int err = 0;
int Item[ 6 ] = {0x901F,0x902F,0x913F,0x914F,0x915F,0x916F};
for(int i = 0; i < 6 ;i++)
{
err <<= 1;
if(!ReadItem( Item[i], RETRYNUM))
{
err |= 0x01;
}
}
return err;
}
int CMeterGB::OnReadPVC()
{
int err = 0;
int Item[ ] = {
0xB611,0xB612,0xB613,0xB621,0xB622,
0xB623,0xB630,0xB631,0xB632,0xB633,
0xB623,0xB640,0xB641,0xB642,0xB643,
0xB650,0xB651,0xB652,0xB653,0
};
for(int i = 0; Item[i]; i++)
{
err <<= 1;
if(!ReadItem( Item[i], RETRYNUM))
{
err |= 0x01;
}
}
return err;
}
int CMeterGB::OnReadMD( )
{
int err = 0;
int Item[ 4 ] = {0xA01F,0xA02F,0xB01F,0xB02F};
for(int i = 0; i < 4; i++)
{
err <<= 1;
if(!ReadItem( Item[i], RETRYNUM))
{
err |= 0x01;
}
}
return err;
}
int CMeterGB::OnReadEvent()
{
int err = 0;
int Item[ 6 ] = {0xB210,0xB211,0xB212,0xB213,0xB31F,0xB32F};
for(int i = 0; i < 6; i++)
{
err <<=1;
if(!ReadItem( Item[i], RETRYNUM))
{
err |= 0x01;
}
}
return err;
}
int CMeterGB::OnReadOther()
{
int err = 0;
int Item[ 5 ] = {0xC010,0xC011,0xC030,0xC031,0xC33F};//Ok
for(int i = 0; i < 5; i++)
{
err <<=1;
if(!ReadItem( Item[i], RETRYNUM))
{
err |= 0x01;
}
}
return err;
}
bool CMeterGB::ReadItem(int Item, int RetryCount)
{
int FrmLen,RecvLen;
BYTE tmp_buf[256];
FrmLen = pMPBase->FormReadDataFrame(OutFram, Item, m_meter.com_para.addr);
if(FrmLen == 0)
{
#ifdef DBUG_PRO
printf("\r\n组织命令数据失败!!!!");
#endif
return false;
}
int j = 0xFFFF,i;
for(i = 0; i < RetryCount; i ++)
{
if( !OnOpenCom() )
{
continue;//串行口打开失败
}
Write(OutFram,FrmLen); //发送帧
if ( !WaitForReponse(TIME_SEC) ) //等待回应帧
{
OnCloseCom();
continue;
}
RecvLen = Read(tmp_buf,sizeof(tmp_buf) ); //读取帧
OnCloseCom();
DataLen = 0;
j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,Item,DataFrame,DataLen,m_meter.com_para.addr);
if ( j == 0)//解析帧
{
if(DataLen > 0)
{
// if(Item == 0xb611)
// {
// printf("\r\nSAVE DATA%02x%02x %d",DataFrame[0],DataFrame[1],m_meter.No);
// }
pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,0,DataLen);
//GetShmData(BYTE * data, int posNum, int item, int & dataLen)
// pShmMan->GetShmData(DataFrame, m_meter.No, Item,DataLen);
// if(Item == 0xb611)
// {
// printf("\r\nREAD DATA%02x%02x %d\r\n",DataFrame[0],DataFrame[1],m_meter.No);
// }
}
else
pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,1,DataLen);
return true;
}
if(j == 0x0600)
{
pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen);
return true;
}
}
if( i >= RetryCount && j == 0xFFFF)
{
pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen);
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -