📄 mpzj.cpp
字号:
// MPZJ.cpp: implementation of the CMPZJ class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "MPZJ.h"
#include <stdlib.h>
#include <string.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//const int CMPZJ::METER_GB_ITEM[1000] = {0,0};
CMPZJ::CMPZJ()
{
}
//tm
CMPZJ::~CMPZJ()
{
}
int CMPZJ::FormCheckClock(BYTE *buff,time_t *m_time , BYTE * addr)//设置电表时钟
{
return 0;
}
int CMPZJ::FormReadDataFrame(BYTE *buff, int item , BYTE * addr)//读取数据
{
int m_Item = CheckItem(item);
if( m_Item == 0)
return 0;
BYTE DI0 = m_Item & 0xFF;
BYTE DI1 = (m_Item >> 8) & 0xFF ;
buff[0] = 0xfe;
buff[1] = 0x68;
buff[2] = 0x03;
buff[3] = 0x03;
buff[4] = 0x68;
buff[5] = addr[0];
buff[6] = DI0;//控制码
buff[7] = DI1; //数据长度
buff[8] = GetCheckSum(buff + 5, 3);
buff[9] = 0x0D;
buff[10]= 0x00;
return 11;
}
int CMPZJ::FormSetAddress(BYTE *buff, BYTE *addr)//设置电表地址
{
return 0;
}
int CMPZJ::ProcReturnedFrame(BYTE *inbuff, int inLen,int item, BYTE *outbuff,int &outlen,BYTE *addr)
{
int i =0;
while( i < (inLen - 7))//2*0x68 + 2 * Len + 1 * 0x0D + 1 * crc + 1 * addr
{
if(inbuff[i] == 0x68 && inbuff[i + 3] == 0x68 && inbuff[i + 1] == inbuff[i + 2])//找到数据帧头部
{
break;
}
i++;
}
if(i >= (inLen - 7))//在有效数据长度内没有找到同步字
{
return 0x0100;//数据长度不正确
}
BYTE *pData = &inbuff[i];//数据起始
BYTE Len = pData[1] + 2 + 4;//2*0x68 + 2 * Len
if(Len > inLen - i)
{
return 0x0100;
}
if(pData[Len - 1] != 0x0D)
{
return 0x0200;//没有结束标志
}
BYTE m_check = GetCheckSum(pData + 4,Len - 6);
if(m_check != pData[Len - 2])
{
return 0x0300; //校验和不对
}
return ProcFullFrame( pData, item, outbuff, outlen, addr);
}
int CMPZJ::CheckItem(int Item_data)
{
int data = Item_data & 0x3FFF;//bit15 bit14 == 1 表示设置,==0 表示查询
char LoBYTE = Item_data & 0xFF;
char HiBYTE = ( Item_data & 0xFF00 ) >> 8;
char LoBCD = LoBYTE & 0x0F;
char HiBCD = (LoBYTE & 0xF0) >> 4;
switch(HiBYTE)
{
case 0x01://当前电量
case 0x02://上月电量 上月需量
if(LoBYTE == 0x00)
return data;
if((HiBCD >= 1 && HiBCD <= 6) && (LoBCD >= 0 &&LoBCD <= 5))
return data;
break;
case 0x03:
if(LoBYTE == 0x00)
return data;
if(LoBYTE >= 0x10 && LoBYTE <= 0x18)
return data;
break;
case 0x04:
if(LoBYTE == 0x00)
return data;
if(LoBYTE >= 0x10 && LoBYTE <= 0x1A)
return data;
break;
case 0x05:
if(LoBYTE == 0x00)
return data;
if((LoBYTE >= 0x10 && LoBYTE <= 0x16 ) ||(LoBYTE >= 0x20 && LoBYTE <= 0x27))
return data;
break;
case 0x06:
if(LoBYTE == 0x00)
return data;
if((LoBYTE >= 0x10 && LoBYTE <= 0x15 ) ||(LoBYTE >= 0x20 && LoBYTE <= 0x25))
return data;
break;
case 0x07:
if(LoBYTE == 0x00)
return data;
if(LoBYTE >= 0x10 && LoBYTE <= 0x2F )
return data;
break;
default:
return 0;
}
return 0;
}
int CMPZJ::ProcFullFrame(BYTE *data, int item,BYTE *outbuff,int &outlen, BYTE *addr)//返回完整数据帧处理
{
if( addr[0] != data[4] )//地址不一侄
{
return 0x0400;//地址不一样
}
if(data[ 1 ] == 0x01)
{
return 0x0600;//终端无数据
}
if(data[ 1] == 0x02)
{
if(data[ 5 ] == 0xF0)
return 0x0600;//终端无数据;
else
return 0;
}
if( item != (data[ 6 ] * 256 + data[5]))
return 0x0500;
outlen = (int) data[1] - 3;
memcpy( (void *)outbuff, (void *)&data[7], data[1] - 3 );
return 0;
}
int CMPZJ::ChangeDataFromZJToGB(BYTE *pInData,BYTE pOutData,BYTE ItemZJ,BYTE ItemGB)
{
return 0;
}
/////////////////////////////////////////////////////////////////////////////
typedef struct
{
int Item;
BYTE Len;
BYTE Flags;
}ITEM_LEN;//数据项目的信息
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -