⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 protocol.inc

📁 单相复费率MSP430硬件时钟参考代码,MSP413设计方案
💻 INC
📖 第 1 页 / 共 2 页
字号:
#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 + -