📄 meterzj.cpp
字号:
// MeterZJ.cpp: implementation of the CMeterZJ class.
//
//////////////////////////////////////////////////////////////////////
#include "MeterZJ.h"
#include "MPZJ.h"
#include "MPTran.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMeterZJ::CMeterZJ()
{
pMPBase = new CMPTran();
}
CMeterZJ::CMeterZJ( METERPARA meter)
{
pMPBase = new CMPTran();
memcpy(&m_meter,&meter,sizeof(METERPARA));
m_meter.com_para.addr[1] = m_meter.type ;
}
CMeterZJ::~CMeterZJ()
{
}
int CMeterZJ::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!!!",m_meter.No);
}
#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 CMeterZJ::OnReadPVC()
{
BYTE err = 0;
int Item[4] = {0xB63F,0xB64F,0xB61F,0xB62F};
for(int i = 0; i < 4 ;i++)
{
err <<= 1;
if(!ReadItem( Item[i], RETRYNUM))
{
err |= 0x01;
}
}
return err;
}
int CMeterZJ::OnReadEnergy( )
{
BYTE err = 0;
int Item[ 2 ] = {0x901F,0x902F};//对应浙江用电协议的类别
for(int i = 0; i < 2 ;i++)
{
err <<= 1;
if(!ReadItem( Item[i], RETRYNUM))
{
err |= 0x01;
}
}
return err;
}
int CMeterZJ::OnReadEvent()
{
BYTE err = 0;
/* int Item[ 2 ] = {0x110,0x120};//对应浙江用电协议的类别
int Item_G[2] = {0x901F,0x902F};
for(int i = 0; i < 2 ;i++)
{
err <<= 1;
if(!ReadItem( Item[i],RETRYNUM))
{
err |= 0x01;
}
}
*/ return err;
}
int CMeterZJ::OnReadOther()
{
BYTE err = 0;
int Item[ 1 ] = {0xC33F};//对应浙江用电协议的类别
for(int i = 0; i < 1 ;i++)
{
err <<= 1;
if(!ReadItem( Item[i], RETRYNUM))
{
err |= 0x01;
}
}
return err;
}
int CMeterZJ::OnReadMD( )
{
BYTE 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;
}
bool CMeterZJ:: ReadItem( int Item, int RetryCount)
{
bool Values = false;
int FrmLen,RecvLen;
BYTE tmp_buf[256];
FrmLen = pMPBase->FormReadDataFrame(OutFram, Item, m_meter.com_para.addr);
if(FrmLen == 0)
{
printf("\r\n组织命令数据失败!!!!");
return Values;
}
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)
pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,0,DataLen);
else
pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,1,DataLen);
Values = true;
return true;
}
}
if( i >= RetryCount && j == 0xFFFF)
{
pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen);
}
return Values;
}
//bool CMeterGB::GetData(BYTE *data, int &dataLen, int item)
//{
//
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -