📄 protocol.inc
字号:
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif
#ifndef _AMMETER_PROTOCOL_INC_
#define _AMMETER_PROTOCOL_INC_
#undef TEMPORARILY_NOT_OFFER //暂不提供的功能
#undef PROVINCE_JIANGSU //江苏省规约特殊部分
#define SINGLE_PASSWORD_SCHEME //单套密码方案,国标是多套密码方案,但是为了节约空间,暂时采用单套密码方案???
//单板有两种地址比较方式,一种是广播地址,一种是实际地址,对此用宏定义区分
#define COMPARE_FLAG_SINGLE_NO 0x01 //传入地址为单一表号地址
#define COMPARE_FLAG_BROADCAST 0x10 //传入地址为广播地址
#define COMPARE_FLAG_ERROR 0xFF //传入地址为错误地址
//读写操作的时候,构划的回调函数的返回值
#define _FINISH_RETURN_ 0xFF //返回值,需要调用函数直接做return处理
#define _NOWRITEE2PROM_ 0xFE //返回值,不需要进行E2PROM的写操作
#define _WRITEE2PROM_ 0xFC //返回值,需要进行E2PROM的写操作
#define _NOREADE2PROM_ 0xF8 //返回值,不需要进行E2PROM的读操作
#define _READE2PROM_ 0xF0 //返回值,需要进行E2PROM的读操作
#define _WR_E2PROM_ 0xE0 //返回值,需要进行E2PROM的读或写操作
//RTC
#define RTC_DATA_OFFSET 4
#define RTC_DATA_LEN 3
#define RTC_TIME_OFFSET 0
#define RTC_TIME_LEN 3
#define RTC_DATA_WEEK_OFFSET 3
#define RTC_DATA_WEEK_LEN 4
// ================== E2PROM数据地址定义 ======================
/* @为未实现的 10-15
PTL 为protocol的缩写,意在屏蔽底层驱动的宏定义
*/
// 设备访问密码 3套密码0级最高,每个权限4字节: 1字节权限+3字节密码
#define PTL_ADDRESS_OF_DEVICE_PASSWORD_0 ADDRESS_OF_DEVICE_PASSWORD1
#define LEN_OF_DEVICE_PASSWORD_0 4
#define PTL_ADDRESS_OF_DEVICE_PASSWORD_1 ADDRESS_OF_DEVICE_PASSWORD2
#define LEN_OF_DEVICE_PASSWORD_1 4
#define PTL_ADDRESS_OF_DEVICE_PASSWORD_2 ADDRESS_OF_DEVICE_PASSWORD3
#define LEN_OF_DEVICE_PASSWORD_2 4
// 设备最近一次反向运行的起始时间 - 4字节 0xB020
#define PTL_ADDRESS_OF_START_TIME_MINUS ADDRESS_OF_START_TIME_MINUS
#define LEN_OF_START_TIME_MINUS 6
// 设备反向运行的总时间 - 4字节 江苏规约定义3字节??? 0xB021
#define PTL_ADDRESS_OF_POWER_TIME_MINUS ADDRESS_OF_POWER_TIME_MINUS
#define LEN_OF_POWER_TIME_MINUS 4
// 最近一次编程时间 0xB210
#define PTL_ADDRESS_OF_LAST_PROGRAM_TIMES ADDRESS_OF_PROGRAM_TIME
#define LEN_OF_LAST_PROGRAM_TIMES 6
// 最近一次最大需量清零时间 0xB211
#define PTL_ADDRESS_OF_LAST_REQUIRE_CLEAR_T ADDRESS_OF_LAST_REQUIRE_CLEAR_T
#define LEN_OF_LAST_REQUIRE_CLEAR_T 6
// 编程次数2字节 0xB212
#define PTL_ADDRESS_OF_PROGRAM_TIMES ADDRESS_OF_PROGRAM_TIMES
#define LEN_OF_PROGRAM_TIMES 2
// 最大需量清零次数 0xB213
#define PTL_ADDRESS_OF_REQUIRE_CLEAR_COUNT ADDRESS_OF_REQUIRE_CLEAR_COUNT
#define LEN_OF_REQUIRE_CLEAR_COUNT 2
// 日期及周次,年月日周 0xC010,由RTC获取给用户 可写可读
// 时间 0xC011, 由RTC获取给用户 可写可读
// 最近一次对时日期时间 年月日时分秒 6字节 0xC012
//存入E2PROM也是年月日时分秒,因为不涉及表内运算,所以直接存储,不作字节序转换
#define PTL_ADDRESS_OF_LASTSETTIME_TIME ADDRESS_OF_TIME_REFINE_TIME
#define LEN_OF_LASTSETTIME_TIME 6
// 对时允许误差设置值,辽宁规约0~10分钟,国标=5分钟 0xC013
#define PTL_ADDRESS_OF_CHECKTIME_RANGE ADDRESS_OF_TIME_REFINE
#define LEN_OF_CHECKTIME_RANGE 1
// 对过时的标记位 0xC014 定义一个全局变量来记录吧
//不提供给用户接口,觉得做这个没有意义???
#define PTL_ADDRESS_OF_SUCCESSSETTIME_FLAG ADDRESS_OF_SUCCESSSETTIME_FLAG
#define LEN_OF_SUCCESSSETTIME_FLAG 1
// 设备状态字1字节 0xC020
enum
{
STATE_CHAOBIAO_TYPE = 1, //bit0 抄表方式 0=自动 1=手动
STATE_MAX_QUANTITY_CALCULATE_METHOD = 2, //bit1 最大需量计算方法 =0滑差 1=区间
STATE_BATTERY_VOLTAGE = 4, //bit2 电池电压 =0正常 =1欠压
STATE_POWER_DIRECTION = 0x20, //bit5 有功电能方向 =0正向 =1反向
STATE_NO_POWER_DIRECTION_ = 0x40, //bit6 无功电能方向 =0正向 =1反向
}STATE_INFORMATION_ENUM;
#define PTL_ADDRESS_OF_DEVICE_STATUS ADDRESS_OF_DEVICE_STATUS_MAIN
#define LEN_OF_DEVICE_STATUS 1
#ifdef TEMPORARILY_NOT_OFFER
/* 扩展电表运行状态字-硬件异常类 0xC025 1 字节,设备上电自检
STATE_INFORMATION_EXPAND_ENUM */
/* 扩展电表运行状态字-硬件异常类 0xC025 */
enum
{
STATE_MEMORY_ERROR = 1, //bit0 存储器故障 =0正常 =1ERROR
STATE_RTC_ERROR = 2, //bit1 时钟故障 =0正常 =1ERROR
STATE_LCD_ERROR = 4, //bit2 LCD故障 =0正常 =1ERROR
//bit7、6 电表实际运行的时段 01=峰 10=平 11=谷
}STATE_INFORMATION_EXPAND_ENUM;
#define PTL_ADDRESS_OF_DEVICE_STATUS_EXPAND ADDRESS_OF_DEVICE_STATUS_SUB
#define LEN_OF_DEVICE_STATUS_EXPAND 1
#endif
/* 电表常数(有功) 和 脉冲常数(有功)为同一个概念: 其单位为imp/kW.h
(转/千瓦.小时),每KW.h电能输出脉冲个数表示电度表参数(电表常数)。
脉冲常数 - 4字节
芯片7755发出计费脉冲,可以设定计费比率,比如100个脉冲 1度电,
或者是200个脉冲一度电。
#define PTL_ADDRESS_OF_PLUSE_CONSTANT (ADDRESS_OF_AMMETER_CONSTANT_PLUS+LEN_OF_AMMETER_CONSTANT_PLUS)
#define LEN_OF_PLUSE_CONSTANT 4
*/
// 电表常数(有功) 0xC030 国标表明可以写入
#define PTL_ADDRESS_OF_AMMETER_CONSTANT_PLUS ADDRESS_OF_DEVICE_CONSTANT
#define LEN_OF_AMMETER_CONSTANT_PLUS 3
// 表号 0xC032
#define PTL_ADDRESS_OF_WATCH_NO ADDRESS_OF_DEVICE_NUMBER
#define LEN_OF_WATCH_NO 6
// 用户编号 0xC033
#define PTL_ADDRESS_OF_USER_NO ADDRESS_OF_USER_CODE
#define LEN_OF_USER_NO 6
#ifdef TEMPORARILY_NOT_OFFER
// 设备码 0xC034--------认为和表号相同
#define PTL_ADDRESS_OF_DEVICE_NO ADDRESS_OF_DEVICE_NUMBER
#define LEN_OF_DEVICE_NO 6
#endif
/* 经确认,将循显时间和设备显示选择合成一个标识符0xC115
第一个字节为循显时间,后四个字节倒叙发送显示选择 2003-11-6 */
// 循显时间 0xC113
#define PTL_ADDRESS_OF_CYC_DISPLAY_TIME ADDRESS_OF_DISPLAY_INTERVAL
#define LEN_OF_CYC_DISPLAY_TIME 1
/* 设备显示选择 - 4字节 江苏规约改,国标无此完整说明的项目 0xC115 */
#define PTL_ADDRESS_OF_DISPLAY_CHOOSE ADDRESS_OF_DISPLAY_CHOOSE
#define LEN_OF_DISPLAY_CHOOSE 2
/* 设备每月结算日期(缺省为月初) 也即自动抄表日期 0xC117 2字节
#define PTL_ADDRESS_OF_AUTO_CHAOBIAO_DATE (ADDRESS_OF_SETTLEMENT_DATE+LEN_OF_SETTLEMENT_TIME)
#define LEN_OF_AUTO_CHAOBIAO_DATE 2
*/
#define PTL_ADDRESS_OF_SETTLEMENT_TIME ADDRESS_OF_SETTLEMENT_DAY
#define LEN_OF_SETTLEMENT_TIME 1 /* 目前为日期,几号的零点??? */
// 有功电能起始读数 电表底数 0xC119 在设定正向参数的时候,将反向电量清零了??? 三思
#define PTL_ADDRESS_OF_POWER_STARTVALUE ADDRESS_OF_STARTING_COUNT
#define LEN_OF_POWER_STARTVALUE 16
#ifdef TEMPORARILY_NOT_OFFER
/* 脉冲累计数 江苏省规约里面,脉冲累计数0xC11B:16bytes
需要按照总峰平谷的顺序统计脉冲累计数,是否统计反向的呢???
*/
#define PTL_ADDRESS_OF_PLUSE_COUNT (PTL_ADDRESS_OF_POWER_STARTVALUE+LEN_OF_POWER_STARTVALUE)
#define LEN_OF_PLUSE_COUNT (16+16) //正向反向总峰平谷
#endif
// 设置有功电能起始读数的时间,年月日时分秒 6字节 0xC11B
#define PTL_ADDRESS_OF_POWER_STARTVALUE_TIME ADDRESS_OF_STARTING_COUNT_TIME
#define LEN_OF_POWER_STARTVALUE_TIME 6
/* 电表清零 0xC11C 无需地址
操作: 按照.c文件头部说明处理
*/
// 最近一次电表清零时间,年月日时分秒 6字节 0xC11D
#define PTL_ADDRESS_OF_POWER_CLEAR_TIME ADDRESS_OF_DEVICE_CLEAR_TIME
#define LEN_OF_POWER_CLEAR_TIME 6
// 清零次数 0xC11E
#define PTL_ADDRESS_OF_POWER_CLEAR_COUNT ADDRESS_OF_DEVICE_CLEAR_TIMES
#define LEN_OF_POWER_CLEAR_COUNT 2
/* 功率限制 - 4字节 0xC214
功率限制 - 就是允许用户用电的最大功率,好像普通家用的保险丝一样,
超过额定功率后电表就拉闸。
我方使用15分钟为单位,国标可配
*/
//#define PTL_ADDRESS_OF_POWER_LIMIT ADDRESS_OF_POWER_LIMIT
//#define LEN_OF_POWER_LIMIT 4
// ------------电量存储的开始地址---------------
//最大电量所有信息的起始地址
#define PTL_ADDRESS_OF_START_POWER ADDRESS_OF_TOTAL_POWER_PLUS
//最大电量信息的记录长度
#define LEN_ADDRESS_OF_POWER 40 //(ADDRESS_OF_TOTAL_VALE_MINUS + 4 - ADDRESS_OF_TOTAL_POWER_PLUS)
// 正向电量起始地址
#define PTL_ADDRESS_OF_START_POWER_PLUS ADDRESS_OF_TOTAL_POWER_PLUS
#define LEN_OF_START_POWER_PLUS 16
// 设备总正用电量 - 4字节 901F
#define PTL_ADDRESS_OF_TOTAL_POWER_PLUS ADDRESS_OF_TOTAL_POWER_PLUS
#define LEN_OF_TOTAL_POWER_PLUS 4
// 设备总正峰电量 - 4字节
#define PTL_ADDRESS_OF_TOTAL_APEX_PLUS ADDRESS_OF_TOTAL_APEX_PLUS
#define LEN_OF_TOTAL_APEX_PLUS 4
// 设备总正平电量 - 4字节
#define PTL_ADDRESS_OF_TOTAL_CALM_PLUS ADDRESS_OF_TOTAL_CALM_PLUS
#define LEN_OF_TOTAL_CALM_PLUS 4
// 设备总正谷电量 - 4字节
#define PTL_ADDRESS_OF_TOTAL_VALE_PLUS ADDRESS_OF_TOTAL_VALE_PLUS
#define LEN_OF_TOTAL_VALE_PLUS 4
#if 0
// 设备总正肩电量 - 4字节
#define PTL_ADDRESS_OF_TOTAL_SHOD_PLUS ADDRESS_OF_TOTAL_SHOD_PLUS
#define LEN_OF_TOTAL_SHOD_PLUS
#endif
// 反向电量起始地址
#define PTL_ADDRESS_OF_START_POWER_MINUS ADDRESS_OF_TOTAL_POWER_MINUS
#define LEN_OF_START_POWER_MINUS 20
// 设备总反用电量 - 4字节 902F
#define PTL_ADDRESS_OF_TOTAL_POWER_MINUS ADDRESS_OF_TOTAL_POWER_MINUS
#define LEN_OF_TOTAL_POWER_MINUS 4
// 设备总反峰电量 - 4字节
#define PTL_ADDRESS_OF_TOTAL_APEX_MINUS ADDRESS_OF_TOTAL_APEX_MINUS
#define LEN_OF_TOTAL_APEX_MINUS 4
// 设备总反平电量 - 4字节
#define PTL_ADDRESS_OF_TOTAL_CALM_MINUS ADDRESS_OF_TOTAL_CALM_MINUS
#define LEN_OF_TOTAL_CALM_MINUS 4
// 设备总反谷电量 - 4字节
#define PTL_ADDRESS_OF_TOTAL_VALE_MINUS ADDRESS_OF_TOTAL_VALE_MINUS
#define LEN_OF_TOTAL_VALE_MINUS 4
#if 0
// 设备总反肩电量 - 4字节
#define PTL_ADDRESS_OF_TOTAL_SHOD_MINUS ADDRESS_OF_TOTAL_SHOD_MINUS
#define LEN_OF_TOTAL_SHOD_MINUS
#endif
// --------------------- 最大需量问题 ----------------------
//0x10: //最大需量清零,将时间也清掉了???
//0xA01F 最大正向需量峰平谷 和 反向峰平谷
//最大需量所有信息的起始地址
#define PTL_ADDRESS_OF_START_REQUIRE ADDRESS_OF_REQUIRE_POWER_PLUS
//最大需量信息的记录长度
#define LEN_ADDRESS_OF_REQUIRE (ADDRESS_OF_REQUIRE_VALE_MINUS + 4 - ADDRESS_OF_REQUIRE_APEX_PLUS)
// 设备最大正峰需量 - 4字节
#define PTL_ADDRESS_OF_REQUIRE_APEX_PLUS ADDRESS_OF_REQUIRE_APEX_PLUS
#define LEN_ADDRESS_OF_REQUIRE_APEX_PLUS 4
// 设备最大正平需量 - 4字节
#define PTL_ADDRESS_OF_REQUIRE_CALM_PLUS ADDRESS_OF_REQUIRE_CALM_PLUS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -