📄 protocol.inc
字号:
#define LEN_ADDRESS_OF_REQUIRE_CALM_PLUS 4
// 设备最大正谷需量 - 4字节
#define PTL_ADDRESS_OF_REQUIRE_VALE_PLUS ADDRESS_OF_REQUIRE_VALE_PLUS
#define LEN_ADDRESS_OF_REQUIRE_VALE_PLUS 4
// 设备最大反峰需量 - 4字节
#define PTL_ADDRESS_OF_REQUIRE_APEX_MINUS ADDRESS_OF_REQUIRE_APEX_MINUS
#define LEN_ADDRESS_OF_REQUIRE_APEX_MINUS 4
// 设备最大反平需量 - 4字节
#define PTL_ADDRESS_OF_REQUIRE_CALM_MINUS ADDRESS_OF_REQUIRE_CALM_MINUS
#define LEN_ADDRESS_OF_REQUIRE_CALM_MINUS 4
// 设备最大反谷需量 - 4字节
#define PTL_ADDRESS_OF_REQUIRE_VALE_MINUS ADDRESS_OF_REQUIRE_VALE_MINUS
#define LEN_ADDRESS_OF_REQUIRE_VALE_MINUS 4
//0xB01F 最大正向需量峰平谷 和 反向峰平谷发生时间
//最大需量所有信息的起始地址
#define PTL_ADDRESS_OF_START_REQUIRE_T ADDRESS_OF_REQUIRE_POWER_PLUS_T
//最大需量信息的记录长度
#define LEN_ADDRESS_OF_REQUIRE_T (ADDRESS_OF_REQUIRE_VALE_MINUS_T + 6 - ADDRESS_OF_REQUIRE_APEX_PLUS_T)
// 最大正峰需量发生时间 - 6字节
#define PTL_ADDRESS_OF_REQUIRE_APEX_PLUS_T ADDRESS_OF_REQUIRE_APEX_PLUS_T
#define LEN_ADDRESS_OF_REQUIRE_APEX_PLUS_T 6
// 最大正平需量发生时间 - 6字节
#define PTL_ADDRESS_OF_REQUIRE_CALM_PLUS_T ADDRESS_OF_REQUIRE_CALM_PLUS_T
#define LEN_ADDRESS_OF_REQUIRE_CALM_PLUS_T 6
// 最大正谷需量发生时间 - 6字节
#define PTL_ADDRESS_OF_REQUIRE_VALE_PLUS_T ADDRESS_OF_REQUIRE_VALE_PLUS_T
#define LEN_ADDRESS_OF_REQUIRE_VALE_PLUS_T 6
// 最大反峰需量发生时间 - 6字节
#define PTL_ADDRESS_OF_REQUIRE_APEX_MINUS_T ADDRESS_OF_REQUIRE_APEX_MINUS_T
#define LEN_ADDRESS_OF_REQUIRE_APEX_MINUS_T 6
// 最大反平需量发生时间 - 6字节
#define PTL_ADDRESS_OF_REQUIRE_CALM_MINUS_T ADDRESS_OF_REQUIRE_CALM_MINUS_T
#define LEN_ADDRESS_OF_REQUIRE_CALM_MINUS_T 6
// 最大反谷需量发生时间 - 6字节
#define PTL_ADDRESS_OF_REQUIRE_VALE_MINUS_T ADDRESS_OF_REQUIRE_VALE_MINUS_T
#define LEN_ADDRESS_OF_REQUIRE_VALE_MINUS_T 6
// ---------------- 电量索引区域的起始地址 -----------------
// 日记录索引号 - 1字节 ???
#define PTL_ADDRESS_OF_DAY_LOG_INDEX ADDRESS_OF_DAY_LOG_INDEX
#define LEN_OF_DAY_LOG_INDEX 1
// 月记录索引号 - 1字节 ???
#define PTL_ADDRESS_OF_MONTH_LOG_INDEX ADDRESS_OF_MONTH_LOG_INDEX
#define LEN_OF_MONTH_LOG_INDEX 1
#if 1 //暂时不用
// 月信息 - 1字节 ???
#define PTL_ADDRESS_OF_RECODE_MONTH ADDRESS_OF_RECODE_MONTH
#define LEN_OF_RECODE_MONTH 1
// 日信息 - 1字节 ??? 暂时不用
#define PTL_ADDRESS_OF_RECODE_DAY ADDRESS_OF_RECODE_DAY
#define LEN_OF_RECODE_DAY 1
#endif
// ---------------- 多费率存储区域定义 --------------------
/* 多费率索引说明
p个时区,暂定12份: 【月】【日】【日时段表的索引号】
q个日时段表q<=8个: 【时段索引号】---------------------我方实现12个
m个时段m<=10个: 【时】【分】【费率索引号n<=14】----我方实现12个
n个费率n<=14: 目前最多4种:平肩谷峰
N个公共假日区,暂定12份: 【月】【日】【日时段表的索引号】
一个周休日采用的日时段表号
// 时区设置数据存储地址,每项的存储格式为:
// typedef struct tag_TimeZone
// {
// unsigned char Month; - 时区的起始月份
// unsigned char Day; - 时区的起始日期
// unsigned char Index; - 日时段表的索引号 <=8
// }TimeZone_S;
// 如此的存储格式限定了时段设置不能跨零点???
//3*8
// 时段设置数据存储地址,每项的存储格式为:
// typedef struct tag_TimeSect
// {
// unsigned char Hour; - 时段的起始小时
// unsigned char Minute; - 时段的起始分钟
// unsigned char Attribute; - 时段属性
// }TimeSect_S;
// TimeSect_S strTimeSect[8][10];
// 如此的存储格式限定了时段设置不能跨零点
//3字节*最大10个时段*最大8个日时段表
一个时区可选择 12个日时段表中的一个
每个日时段表 都有12个配置好的时段,用以标记何时何种计费方式
*/
#define XXXXXXXXXXXX 2000
#ifdef TEMPORARILY_NOT_OFFER
// 年时区数 0xC310 固定12个,不可改
#define PTL_ADDRESS_OF_YEAR_TIME_ZONE_NUM XXXXXXXXXXXX
#define LEN_OF_YEAR_TIME_ZONE_NUM 1
// 日时段表数 0xC311 固定12个,不可改
#define PTL_ADDRESS_OF_DAY_TIMESECTION_TABLE_NUM XXXXXXXXXXXX
#define LEN_OF_DAY_TIMESECTION_TABLE_NUM 1
// 日时段数 0xC312 固定12个,不可改
#define PTL_ADDRESS_OF_DAY_TIMESECTION_NUM ADDRESS_OF_PERIOD_OF_TIME_COUNT
#define LEN_OF_DAY_TIMESECTION_NUM 1
// 费率数 0xC313 固定6种 正向峰平谷 反向峰平谷
#define PTL_ADDRESS_OF_CHARGE_TYPE_NUM XXXXXXXXXXXX
#define LEN_CHARGE_TYPE_NUM 1
// 公共假日数 0xC314
#define PTL_ADDRESS_OF_COMM_HOLIDAY_NUM XXXXXXXXXXXX
#define LEN_OF_COMM_HOLIDAY_NUM 1
#endif
// 时区信息集合 max 36字节 最多12个时区 0xC32F
#define PTL_ADDRESS_OF_TIME_ZONE ADDRESS_OF_TIME_ZONE //时区
#define LEN_OF_TIME_ZONE 36
// 日时段表 0xC33F--0xC3EF
#define PTL_ADDRESS_OF_DAY_TIMESECTION_TABLE ADDRESS_OF_TIME_SECT
#define MAX_DAY_TIMESECTION_NUM 12 //最大可设定的日时段数为12个,每个对应一个时段表,国标为10个
#define MAX_CHARGE_TYPE 12 //最多有12种费率类型,国标为8个
#define LEN_OF_EVERY_TIMESECTION_TABLE 3 //每一个时段表为3字节
#define LEN_OF_EVERY_DAY_TIMESECTION_TABLE 37 //每一个日时段表为3*MAX_DAY_TIMESECTION_NUM=36字节,其中允许设置12个时段表,每个时段表3字节共36字节
//所有日时段表共占多少字节 = LEN_OF_EVERY_DAY_TIMESECTION_TABLE * MAX_CHARGE_TYPE
#define LEN_OF_TOTAL_DAY_TIMESECTION_TABLE 432
#ifdef TEMPORARILY_NOT_OFFER
//公共假日信息集合(第N公共假日日期及日时段表号) N=12个 0xC41F
#define PTL_ADDRESS_OF_COMM_HOLIDAY XXXXXXXXXXXX
#define LEN_OF_COMM_HOLIDAY 36
//周休日采用的日时段表号 0x41E 或者 0x42E, 最后为0xC42E
#define PTL_ADDRESS_OF_WEEKEND XXXXXXXXXXXX
#define LEN_OF_WEEKEND 36
#endif
// ----------------- 历史数据 ----------------------
// 之前12个月的冻结数据存储地址,每月的存储格式为:
// typedef struct tag_MonthLog
// {
// unsigned char Year; - 年信息
// unsigned char Month; - 月信息
// unsigned long PlusTotalLog; - 正总电量
// unsigned long PlusApexLog; - 正峰电量数据
// unsigned long PlusCalmLog; - 正平电量数据
// unsigned long PlusValeLog; - 正谷电量数据
// //不要unsigned long PlusShodLog; - 正肩电量数据
// unsigned long MinusTotalLog; - 反总电量
// unsigned long MinusApexLog; - 反峰电量数据
// unsigned long MinusCalmLog; - 反平电量数据
// unsigned long MinusValeLog; - 反谷电量数据
// //不要unsigned long MinusShodLog; - 反肩电量数据
// }MonthLog_S;
// 共占用34*12=408个字节
#define PTL_ADDRESS_OF_MONTH_LOG ADDRESS_OF_MONTH_LOG
#define LEN_OF_EVERY_MONTH_LOG 40
#define OFF_OF_POWER_IN_MONTH_LOG 0
#define LEN_OF_MONTH_LOG 480
// 之前30天的冻结数据存储地址,每天的存储格式为:
// typedef struct tag_DayLog
// {
// unsigned char Month; - 月信息
// unsigned char Day; - 日信息
// unsigned long PlusCalmLog; - 正平电量数据
// unsigned long MinusCalmLog; - 反平电量数据
// unsigned long PlusShodLog; - 正肩电量数据
// unsigned long MinusShodLog; - 反肩电量数据
// unsigned long PlusValeLog; - 正谷电量数据
// unsigned long MinusValeLog; - 反谷电量数据
// unsigned long PlusApexLog; - 正峰电量数据
// unsigned long MinusApexLog; - 反峰电量数据
// }DayLog_S;
// 共占用34*30=1020个字节
#define PTL_ADDRESS_OF_DAY_LOG ADDRESS_OF_DAY_LOG
#define LEN_OF_DAY_LOG 780
//=================== END ==================
extern unsigned char UartState;
extern unsigned char PowerAttribute; // 当前记量属性
////////////////////////////////////////////////////////////////
//================ 函数声明区 ==================
//设置系统当前时间信息,包括年月日时分秒
extern void SetSystemTime(void);
//从数据存储体里面的指定位置ucAddr,获取指定长度ucLen的数据,存到指定的内存地址pucData开始的地方
extern void E2promRead(unsigned short addr,unsigned char *data,unsigned char len);
//向数据存储体的指定位置ucAddr,写入指定长度ucLen的数据,这些数据存放在地址pucData开始的地方
extern void E2promWrite(unsigned short addr,unsigned char *data,unsigned char len);
//系统运行状态字,江苏省通信规约里面指定的,其他规约未见有此内容???
extern unsigned char SystemRunningState(unsigned char *);
extern void E2promInit(void);
extern void RealtimeInit(void);
extern void RealtimeRead(unsigned char addr,unsigned char *data,unsigned char len);
extern void RealtimeWrite(unsigned char addr,unsigned char *data,unsigned char len);
/* 为处理通讯规约里面年月日时分秒与RTC内的索引地址反序问题 */
extern void PLT_RealtimeRead(unsigned char addr,unsigned char *data,unsigned char len);
extern void PLT_RealtimeWrite(unsigned char addr,unsigned char *data,unsigned char len);
extern unsigned char __bcd_to_char(unsigned char a);
extern unsigned short __bcd_add_short(unsigned short a, unsigned short b);
////////////////////////////////////////////////////////////////
//通信协议初始化函数
//void Protocol_Init();
//接收帧信息,底层驱动在每接收到一个字符后,调用本函数,利用全局结构strFrameInfo来记录接收数据
unsigned char Rx_FrameInfo(void);
//比较主站发来的地址信息是否正确,???AAH 和 广播地址是否可以在任何时候都被使用,而没有具体命令和类型的限制???
unsigned char CompareAddressArea(void);
void ReversalDataArray(unsigned char *pucData, unsigned char ucDataLen);
//读从站数据,函数内根据各种读操作进行了区分
unsigned char Read_SlaveStationData(void);
//写数据到从站,函数内根据各种不同的写操作,进行了区分
unsigned char Write_SlaveStationData(void);
//解析一个接收到帧结构,看是读操作、写操作、广播校时等
extern void Parse_RxFrame(void);
//为了将发送函数与底层驱动适配
//发送应答帧
void Tx_FrameInfo(void);
//检测提供的密码是否正确
unsigned char CheckPassword(unsigned char *);
////////////////////////////////////////////////////////////////
#endif
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -