├── con3761adp.c ├── README.md ├── makefile ├── fmprint.h ├── fmprint.c └── con3761adp.h /con3761adp.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiangruipuzhao/3761/HEAD/con3761adp.c -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Q/GDW 376.1-2009 协议实现 2 | 3 | * 实现Q/GDW 376.1-2009《电力用户用电信息采集系统通信协议:主站与采集终端通信协议》 4 | * 定义该协议相关的数据类型 5 | * 实现该协议封装及解析的相关接口 6 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | # 2 | # FreeModbus Linux PORT - Makefile 3 | # 4 | # Copyright (c) 2006 Christian Walter, ? s::can, Vienna 2006. 5 | # 6 | # --------------------------------------------------------------------------- 7 | 8 | # --------------------------------------------------------------------------- 9 | # platform dependencies 10 | # --------------------------------------------------------------------------- 11 | ifneq ($(strip $(shell gcc -v 2>&1 |grep "cygwin")),) 12 | CYGWIN_BUILD = YES 13 | endif 14 | CC = gcc 15 | CXX = g++ 16 | OBJCOPY = objcopy 17 | INSIGHT = /opt/insight-x86/bin/insight 18 | 19 | # --------------------------------------------------------------------------- 20 | # project specifics 21 | # --------------------------------------------------------------------------- 22 | CFLAGS = -MD -g3 -Wall 23 | LDFLAGS = 24 | ifeq ($(CYGWIN_BUILD),YES) 25 | else 26 | #LDFLAGS += -lpthread 27 | endif 28 | 29 | TGT = 1 30 | OTHER_CSRC = 31 | OTHER_ASRC = 32 | CSRC = qgdw_3761_api.c con3761adp.c fmprint.c main.c 33 | ASRC = 34 | OBJS = $(CSRC:.c=.o) $(ASRC:.S=.o) 35 | NOLINK_OBJS = $(OTHER_CSRC:.c=.o) $(OTHER_ASRC:.S=.o) 36 | DEPS = $(OBJS:.o=.d) $(NOLINK_OBJS:.o=.d) 37 | BIN = $(TGT) 38 | 39 | .PHONY: clean all 40 | 41 | all: $(BIN) 42 | 43 | debug: 44 | $(INSIGHT) --se=$(TGT) 45 | 46 | $(BIN): $(OBJS) $(NOLINK_OBJS) 47 | $(CC) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@ 48 | 49 | clean: 50 | rm -f $(DEPS) 51 | rm -f $(OBJS) $(NOLINK_OBJS) 52 | rm -f $(BIN) 53 | 54 | # --------------------------------------------------------------------------- 55 | # rules for code generation 56 | # --------------------------------------------------------------------------- 57 | %.o: %.c 58 | $(CC) $(CFLAGS) -o $@ -c $< 59 | 60 | %.o: %.S 61 | $(CC) $(ASFLAGS) -o $@ -c $< 62 | 63 | # --------------------------------------------------------------------------- 64 | # # compiler generated dependencies 65 | # --------------------------------------------------------------------------- 66 | -include $(LWOS_DEPS) $(PORT_DEPS) $(APPL_DEPS) 67 | 68 | -------------------------------------------------------------------------------- /fmprint.h: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | 3 | 版权所有 (C), 2001-2011, 国网电科院通信与用电技术分公司 4 | 5 | ****************************************************************************** 6 | 文 件 名 : fmprint.h 7 | 版 本 号 : 初稿 8 | 作 者 : liming 9 | 生成日期 : 2013年4月26日 星期五 10 | 最近修改 : 11 | 功能描述 : 终端格式化输出头文件,实现终端样式输出 12 | 函数列表 : 13 | 修改历史 : 14 | 1.日 期 : 2013年4月26日 星期五 15 | 作 者 : liming 16 | 修改内容 : 创建文件 17 | 18 | ******************************************************************************/ 19 | 20 | // 功能代码 21 | #define FM_ALL_NORMAL 0x00000 // 重新设置属性到缺省设置 22 | #define FM_BOLD 0x10000 // 粗体 23 | #define FM_HALF_BRIGHT 0x20000 // 设置一半亮度 24 | #define FM_UNDERLINE 0x40000 25 | #define FM_FLASH 0x80000 // 闪烁 26 | #define FM_RES_WHITE 0x100000 // 反白显示 27 | #define FM_IN_VISIBLE 0x200000 // 不可见 28 | 29 | // 前景色 30 | #define FR_NORMAL 0x00 31 | #define FR_BLACK 0x01 32 | #define FR_RED 0x02 33 | #define FR_GREEN 0x03 34 | #define FR_YELLOW 0x04 35 | #define FR_BLUE 0x05 36 | #define FR_MAGENTA 0x06 // Magenta 紫红色 37 | #define FR_CYAN 0x07 // 青蓝色 38 | #define FR_WHITE 0x08 39 | #define FR_SET_UNDERLINE 0x09 // 默认前景色加下划线 40 | #define FR_RMV_UNDERLINE 0x0A 41 | 42 | // 背景色 43 | #define BK_NORMAL 0x0000 44 | #define BK_BLACK 0x0100 45 | #define BK_RED 0x0200 46 | #define BK_GREEN 0x0300 47 | #define BK_YELLOW 0x0400 48 | #define BK_BLUE 0x0500 49 | #define BK_MAGENTA 0x0600 // Magenta 紫红色 50 | #define BK_CYAN 0x0700 // 青蓝色 51 | #define BK_WHITE 0x0800 52 | #define BK_DEFAULT 0x0900 // 默认背景色 53 | 54 | 55 | void fmt_print(char* str,...); 56 | void fm_print(char* str, unsigned int ulFormat); 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | #define FMT_ALL_NORMAL "0" // 重新设置属性到缺省设置 68 | #define FMT_BOLD "1" // 粗体 69 | #define FMT_HALF_BRIGHT "2" // 设置一半亮度 70 | #define FMT_UNDERLINE "4" 71 | #define FMT_FLASH "5" // 闪烁 72 | #define FMT_RES_WHITE "7" // 反白显示 73 | #define FMT_IN_VISIBLE "8" // 不可见 74 | 75 | // 前景色 76 | #define FR_COLOR_BLACK "30" 77 | #define FR_COLOR_RED "31" 78 | #define FR_COLOR_GREEN "32" 79 | #define FR_COLOR_YELLOW "33" 80 | #define FR_COLOR_BLUE "34" 81 | #define FR_COLOR_MAGENTA "35" // Magenta 紫红色 82 | #define FR_COLOR_CYAN "36" // 青蓝色 83 | #define FR_COLOR_WHITE "37" 84 | #define FR_COLOR_SET_UNDERLINE "38" // 默认前景色加下划线 85 | #define FR_COLOR_RMV_UNDERLINE "39" 86 | 87 | // 背景色 88 | #define BK_COLOR_BLACK "40" 89 | #define BK_COLOR_RED "41" 90 | #define BK_COLOR_GREEN "42" 91 | #define BK_COLOR_YELLOW "43" 92 | #define BK_COLOR_BLUE "44" 93 | #define BK_COLOR_MAGENTA "45" // Magenta 紫红色 94 | #define BK_COLOR_CYAN "46" // 青蓝色 95 | #define BK_COLOR_WHITE "47" 96 | #define BK_COLOR_DEFAULT "49" // 默认背景色 97 | 98 | 99 | 100 | 101 | #define FM_PRINT_BNG "\033[" 102 | #define FM_PRINT_MID "m" 103 | #define FM_PRINT_END "\033[0m" 104 | 105 | 106 | 107 | 108 | 109 | 110 | /* 111 | |---------------|---------------|---------------|---------------| 112 | 前景色 背景色 特殊样式 光标控制 113 | |---------------|---------------|---------------|---------------| 114 | 115 | 116 | 117 | 118 | */ 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | typedef enum 127 | { 128 | E_BK_NORMAL = 0, 129 | E_BK_BLACK, // 1 130 | E_BK_RED, //2// 2 131 | E_BK_GREEN, // 3 132 | E_BK_YELLOW, // 4 133 | E_BK_BLUE, // 5 134 | E_BK_MAGENTA, // 6 135 | E_BK_CYAN, // 7 136 | E_BK_WHITE, // 8 137 | E_BK_DEFAULT, // 9 138 | 139 | }eBackColor; 140 | 141 | typedef enum 142 | { 143 | EFMT_ALL_NORMAL, // 0 重新设置属性到缺省设置 144 | EFMT_BOLD, // 1 粗体 145 | EFMT_HALF_BRIGHT, // 2 设置一半亮度 146 | EFMT_UNDERLINE, // 4 147 | EFMT_FLASH, // 5 闪烁 148 | EFMT_RES_WHITE, // 7 反白显示 149 | EFMT_IN_VISIBLE, // 8 不可见 150 | 151 | }eEffect; 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | -------------------------------------------------------------------------------- /fmprint.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "fmprint.h" 6 | 7 | 8 | 9 | 10 | /***************************************************************************** 11 | 函 数 名 : fmt_print 12 | 功能描述 : 格式化输出 13 | 输入参数 : char* str 14 | int fmt 15 | ... 16 | 输出参数 : 无 17 | 返 回 值 : 18 | 调用函数 : 19 | 被调函数 : 20 | 21 | 修改历史 : 22 | 1.日 期 : 2013年4月26日 星期五 23 | 作 者 : liming 24 | 修改内容 : 新生成函数 25 | 26 | *****************************************************************************/ 27 | void fmt_print(char* str,...) 28 | { 29 | if(!str) 30 | { 31 | return; 32 | } 33 | 34 | 35 | char outbuf[1024] = {0}; 36 | char *pStr; 37 | int len = 0; 38 | 39 | va_list arg_ptr; 40 | 41 | len += sprintf(outbuf, "%s", FM_PRINT_BNG); 42 | va_start(arg_ptr, str); 43 | do 44 | { 45 | pStr = va_arg(arg_ptr, char*); 46 | if(pStr != NULL) 47 | len += sprintf(outbuf+len,"%s;", pStr); 48 | 49 | }while(pStr != NULL); 50 | 51 | va_end(arg_ptr); 52 | sprintf(outbuf+len-1, "%s%s%s",FM_PRINT_MID, str, FM_PRINT_END); 53 | printf(outbuf); 54 | 55 | 56 | 57 | 58 | } 59 | 60 | 61 | 62 | /***************************************************************************** 63 | 函 数 名 : fm_print 64 | 功能描述 : | | 的方法来输入格式 65 | 输入参数 : char* str 66 | unsigned int ulFormat 67 | 输出参数 : 无 68 | 返 回 值 : 69 | 调用函数 : 70 | 被调函数 : 71 | 72 | 修改历史 : 73 | 1.日 期 : 2013年4月26日 星期五 74 | 作 者 : liming 75 | 修改内容 : 新生成函数 76 | 77 | 78 | 使用帮助:前景色 | 背景色 | 多种功能码组合 79 | 80 | // 功能代码 81 | FM_ALL_NORMAL 重新设置属性到缺省设置 82 | FM_BOLD 粗体 83 | FM_HALF_BRIGHT 设置一半亮度 84 | FM_UNDERLINE 下划线 85 | FM_FLASH 闪烁 86 | FM_RES_WHITE 反白显示 87 | FM_IN_VISIBLE 不可见 88 | 89 | // 前景色 90 | FR_NORMAL 0x00 91 | FR_BLACK 0x01 92 | FR_RED 0x02 93 | FR_GREEN 0x03 94 | FR_YELLOW 0x04 95 | FR_BLUE 0x05 96 | FR_MAGENTA 0x06 Magenta 紫红色 97 | FR_CYAN 0x07 青蓝色 98 | FR_WHITE 0x08 99 | FR_SET_UNDERLINE 默认前景色加下划线 100 | FR_RMV_UNDERLINE 101 | 102 | // 背景色 103 | BK_NORMAL 104 | BK_BLACK 105 | BK_RED 106 | BK_GREEN 107 | BK_YELLOW 108 | BK_BLUE 109 | BK_MAGENTA Magenta 紫红色 110 | BK_CYAN 青蓝色 111 | BK_WHITE 112 | BK_DEFAULT 默认背景色 113 | 114 | *****************************************************************************/ 115 | void fm_print(char* str, unsigned int ulFormat) 116 | { 117 | unsigned char ucFrontColor = 0; 118 | unsigned char ucBackColr = 0; 119 | unsigned char ucEffect = 0; 120 | unsigned char ucCtrl = 0; 121 | unsigned int ulFormatTmp = 0; 122 | int len = 0; 123 | 124 | ucFrontColor = ulFormat & 0xFF; 125 | ucBackColr = (ulFormat >> 8) & 0xFF; 126 | ucEffect = (ulFormat >> 16) & 0xFF; 127 | ucCtrl = (ulFormat >> 24) & 0xFF; 128 | 129 | char strFmt[64] = {0}; 130 | 131 | switch(ucFrontColor) 132 | { 133 | 134 | case FR_NORMAL: 135 | break; 136 | 137 | case FR_BLACK: 138 | len = sprintf(strFmt,"%s",FR_COLOR_BLACK); 139 | break; 140 | case FR_RED: 141 | len = sprintf(strFmt,"%s",FR_COLOR_RED); 142 | break; 143 | case FR_GREEN: 144 | len = sprintf(strFmt,"%s",FR_COLOR_GREEN); 145 | break; 146 | case FR_YELLOW: 147 | len = sprintf(strFmt,"%s",FR_COLOR_YELLOW); 148 | break; 149 | case FR_BLUE: 150 | len = sprintf(strFmt,"%s",FR_COLOR_BLUE); 151 | break; 152 | case FR_MAGENTA: 153 | len = sprintf(strFmt,"%s",FR_COLOR_MAGENTA); 154 | break; 155 | case FR_CYAN: 156 | len = sprintf(strFmt,"%s",FR_COLOR_CYAN); 157 | break; 158 | case FR_WHITE: 159 | len = sprintf(strFmt,"%s",FR_COLOR_WHITE); 160 | break; 161 | case FR_SET_UNDERLINE: 162 | len = sprintf(strFmt,"%s",FR_COLOR_SET_UNDERLINE); 163 | break; 164 | case FR_RMV_UNDERLINE: 165 | len = sprintf(strFmt,"%s",FR_COLOR_RMV_UNDERLINE); 166 | break; 167 | 168 | default: 169 | break; 170 | } 171 | 172 | 173 | if(ucBackColr != 0) 174 | { 175 | len += sprintf(strFmt+len,"%s",";"); 176 | } 177 | 178 | switch(ucBackColr) 179 | { 180 | case E_BK_BLACK: 181 | len += sprintf(strFmt+len,"%s",BK_COLOR_BLACK); 182 | break; 183 | case E_BK_RED: 184 | len += sprintf(strFmt+len,"%s",BK_COLOR_RED); 185 | break; 186 | case E_BK_GREEN: 187 | len += sprintf(strFmt+len,"%s",BK_COLOR_GREEN); 188 | break; 189 | case E_BK_YELLOW: 190 | len += sprintf(strFmt+len,"%s",BK_COLOR_YELLOW); 191 | break; 192 | case E_BK_BLUE: 193 | len += sprintf(strFmt+len,"%s",BK_COLOR_BLUE); 194 | break; 195 | case E_BK_MAGENTA: 196 | len += sprintf(strFmt+len,"%s",BK_COLOR_MAGENTA); 197 | break; 198 | case E_BK_CYAN: 199 | len += sprintf(strFmt+len,"%s",BK_COLOR_CYAN); 200 | break; 201 | case E_BK_WHITE: 202 | len += sprintf(strFmt+len,"%s",BK_COLOR_WHITE); 203 | break; 204 | default: 205 | break; 206 | 207 | } 208 | 209 | if(ucEffect != 0) 210 | { 211 | len += sprintf(strFmt+len,"%s",";"); 212 | } 213 | 214 | ulFormatTmp = ulFormat & 0xFFFF0000; 215 | if(ulFormatTmp & FM_BOLD) 216 | { 217 | len += sprintf(strFmt+len,"%s",FMT_BOLD); 218 | ulFormatTmp &= ~FM_BOLD; 219 | 220 | if(ulFormatTmp != 0) 221 | { 222 | len += sprintf(strFmt+len,"%s",";"); 223 | } 224 | } 225 | 226 | if(ulFormatTmp & FM_HALF_BRIGHT) 227 | { 228 | len += sprintf(strFmt+len,"%s",FMT_HALF_BRIGHT); 229 | ulFormatTmp &= ~FM_HALF_BRIGHT; 230 | if(ulFormatTmp != 0) 231 | { 232 | len += sprintf(strFmt+len,"%s",";"); 233 | } 234 | } 235 | 236 | 237 | if(ulFormatTmp & FM_UNDERLINE) 238 | { 239 | len += sprintf(strFmt+len,"%s",FMT_UNDERLINE); 240 | ulFormatTmp &= ~FM_UNDERLINE; 241 | if(ulFormatTmp != 0) 242 | { 243 | len += sprintf(strFmt+len,"%s",";"); 244 | } 245 | } 246 | 247 | if(ulFormatTmp & FM_FLASH) 248 | { 249 | len += sprintf(strFmt+len,"%s",FMT_FLASH); 250 | ulFormatTmp &= ~FM_FLASH; 251 | if(ulFormatTmp != 0) 252 | { 253 | len += sprintf(strFmt+len,"%s",";"); 254 | } 255 | } 256 | 257 | if(ulFormatTmp & FM_RES_WHITE) 258 | { 259 | len += sprintf(strFmt+len,"%s",FMT_RES_WHITE); 260 | ulFormatTmp &= ~FM_RES_WHITE; 261 | if(ulFormatTmp != 0) 262 | { 263 | len += sprintf(strFmt+len,"%s",";"); 264 | } 265 | } 266 | 267 | if(ulFormatTmp & FM_IN_VISIBLE) 268 | { 269 | len += sprintf(strFmt+len,"%s",FMT_IN_VISIBLE); 270 | ulFormatTmp &= ~FM_IN_VISIBLE; 271 | if(ulFormatTmp != 0) 272 | { 273 | len += sprintf(strFmt+len,"%s",";"); 274 | } 275 | } 276 | 277 | //CTRL 278 | printf("%s%s%s%s%s", FM_PRINT_BNG,strFmt,FM_PRINT_MID,str,FM_PRINT_END); 279 | 280 | 281 | } 282 | 283 | 284 | 285 | -------------------------------------------------------------------------------- /con3761adp.h: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | 3 | 版权所有 (C), 2010-2015, 国网电力通信与用电技术分公司 4 | 5 | ****************************************************************************** 6 | 文 件 名 : con3761adp.h 7 | 版 本 号 : 初稿 8 | 作 者 : liming 9 | 生成日期 : 2013年4月8日 星期一 10 | 最近修改 : 11 | 功能描述 : 集中器376.1协议解析适配层 头文件 12 | 函数列表 : 13 | 修改历史 : 14 | 简写说明 : CM 集中器到主站 MC 主站到集中器 15 | 1.日 期 : 2013年4月8日 星期一 16 | 作 者 : liming 17 | 修改内容 : 创建文件 18 | 19 | ******************************************************************************/ 20 | #ifndef _CON_3761_ADP_H_ 21 | #define _CON_3761_ADP_H_ 22 | #include "qgdw_3761_api.h" 23 | 24 | #pragma pack(push) // 采用一字节对齐 25 | #pragma pack(1) 26 | 27 | typedef eMtErr eCmErr; 28 | 29 | /* (1)定义主站与集中器通信协议命令类型, 每条命令对一条3761协议 30 | * (2)该协议分十六大类,每大类,最多支持255个子命令 31 | * (3)有些大类只能逐个子命令发送,有些命令支持该大类下任意个子命令的组合, 32 | * 但组合的子命令标识需唯一 33 | * (4)适配层编写者需要注册实现,该命令与API命令之间直接相互转换 34 | */ 35 | typedef enum 36 | { 37 | CM_CMD_UNKOWN, // 未知命令 38 | 39 | /* 确认∕否认(AFN=00H) */ 40 | CMD_ALL_OK, // 全部确认 41 | CMD_ALL_DENY, // 全部否认 42 | CMD_ONE_BY_ONE, // 按数据单元标识确认和否认 43 | 44 | 45 | /* 复位命令(AFN=01H) */ 46 | CMD_HARD_INIT, // 硬件初始化 47 | CMD_DATA_INIT, // 数据区初始化 48 | CMD_FACTORY_RESET, // 参数及全体数据区初始化(即恢复至出厂配置) 49 | CMD_PARA_INIT, // 参数(除与系统主站通信有关的)及全体数据区初始化 50 | 51 | 52 | /* 链路接口检测(AFN=02H) */ 53 | CMD_LOG_IN, // 登录 无数据单元 54 | CMD_LOG_OUT, // 退出登录 无数据单元 55 | CMD_HEART_BEAT, // 心跳 无数据单元 56 | 57 | /* 设置参数(AFN == 04H) */ 58 | //CMD_CFG_NOT_ELEC , // 非电气测量点数据参数配置 59 | // 1:温度,2:流量,3:流速,4:压力, 60 | // 5:湿度,6:照度,7:转速,其他:备用 61 | 62 | CMD_CFG_TML_UP, // 设置 终端上行通信口通信参数设置 63 | CMD_CFG_TML_POWER, // 设置 终端电能表/交流采样装置配置参数 64 | CMD_CFG_ASK_1, // 1类数据配置设置(在终端支持的1类数据配置内) CMD_AFN_4_F38_CFG_ASK_1 65 | CMD_CFG_ASK_2, // 2类数据配置设置(在终端支持的2类数据配置内) CMD_AFN_4_F39_CFG_ASK_2 66 | CMD_CFG_AUTO_1, // 定时上报1类数据任务设置 CMD_AFN_4_F65_CFG_AUTO_1 67 | CMD_CFG_AUTO_2, // 定时上报2类数据任务设置 CMD_AFN_4_F66_CFG_AUTO_2 68 | CMD_GO_AUTO_1, // 定时上报1类数据任务启动/停止设置 CMD_AFN_4_F67_GOP_AUTO_1 69 | CMD_GO_AUTO_2, // 定时上报2类数据任务启动/停止设置 CMD_AFN_4_F68_GOP_AUTO_2 70 | 71 | /* 控制命令(AFN == 05H)*/ 72 | CMD_CTRL_CHECK_TIME, // 对时命令 73 | 74 | CMD_PERMIT_TALK_GO, // 允许终端与主站通话 没有应用层数据 pn = p0 75 | CMD_PERMIT_TALK_STOP, // 禁止终端与主站通话 没有应用层数据 pn = p0 76 | 77 | CMD_PERMIT_LINK_ON, // 激活终端连接主站 没有应用层数据 pn = p0 78 | CMD_PERMIT_LINK_OFF, // 命令终端断开连接 没有应用层数据 pn = p0 79 | 80 | CMD_AUTO_REPORT_GO, // 允许终端主动上报 没有应用层数据 pn = p0 81 | CMD_AUTO_REPORT_STOP, // 禁止终端主动上报 没有应用层数据 pn = p0 82 | 83 | 84 | /* 请求配置 (AFN == 09H) */ 85 | CMD_AFN_TML_VERSION, // 终端版本信息 pn = p0 对应数据结构 sMtTmlVersion 86 | CMD_AFN_TML_INPUT_OUT, // 终端支持的输入、输出及通信端口配置 pn = p0 对应数据结构 sMtTmlInputOut 87 | CMD_TML_OTHER_CFG, // 终端支持的其他配置 对应数据结构 sMtTmlOtherCfg 88 | CMD_SUPPORT_PARA_CFG, // 终端支持的参数配置 CMD_AFN_9_F4_SUPPORT_PARA_CFG 89 | CMD_SUPPORT_CTRL_CFG, // 终端支持的控制配置 CMD_AFN_9_F5_SUPPORT_CTRL_CFG 90 | CMD_SUPPORT_ASK1_CFG, // 终端支持的1类数据配置 CMD_AFN_9_F6_SUPPORT_ASK1_CFG 91 | CMD_SUPPORT_ASK2_CFG, // 终端支持的2类数据配置 CMD_AFN_9_F7_SUPPORT_ASK2_CFG 92 | CMD_SUPPORT_EVNT_CFG, // 终端支持的事件记录配置 CMD_AFN_9_F8_SUPPORT_EVNT_CFG 93 | 94 | /* 查询参数(AFN == 0AH) */ 95 | CMD_CFG_TML_UP_Q, // 查询 终端上行通信口通信参数设置 CMD_AFN_A_F1_TML_UP_CFG 96 | CMD_CFG_TML_POWER_Q, // 查询 终端电能表/交流采样装置配置参数 (命令有参数 sMtTmlPowerCfg_Q) CMD_AFN_A_F10_TML_POWER_CFG 97 | CMD_CFG_ASK_1_Q, // 1类数据配置设置(在终端支持的1类数据配置内) (命令有参数 sMtAsk1Cfg_Q) CMD_AFN_A_F38_CFG_ASK_1 98 | CMD_CFG_ASK_2_Q, // 2类数据配置设置(在终端支持的2类数据配置内) (命令有参数 sMtAsk2Cfg_Q) CMD_AFN_A_F39_CFG_ASK_2 99 | CMD_CFG_AUTO_1_Q, // 查询定时上报1类数据任务设置 CMD_AFN_A_F65_CFG_AUTO_1 100 | CMD_CFG_AUTO_2_Q, // 查询定时上报2类数据任务设置 CMD_AFN_A_F66_CFG_AUTO_2 101 | CMD_GOP_AUTO_1_Q, // 定时上报1类数据任务启动/停止设置 CMD_AFN_A_F67_GOP_AUTO_1 102 | CMD_GOP_AUTO_2_Q, // 定时上报2类数据任务启动/停止设置 CMD_AFN_A_F68_GOP_AUTO_2 103 | 104 | /* 请求1类数据(AFN=0CH) */ 105 | CMD_CURNT_PQUI, // 当前三相及总有/无功功率、功率因数,三相电压、电流、零序电流、视在功率 106 | CMD_TML_CLOCK, // 终端日历时钟 数据结构 sMtUserClock CMD_AFN_C_F2_TML_CLOCK 107 | CMD_DC_RLTM_DATA, // 直流模拟量实时数据 CMD_AFN_C_F73_DC_RLTM_DATA 108 | CMD_POWER_CUR, // 当前A、B、C三相正/反向有功电能示值、组合无功1/2电能示值 对应3761命令 CMD_AFN_C_F31_POWER_CUR 109 | CMD_CURT_HARM_VALUE, // 当前A、B、C三相电压、电流2~N次谐波有效值 CMD_AFN_C_F57_CURT_HARM_VALUE 110 | CMD_CURT_HARM_RATE, // 当前A、B、C三相电压、电流2~N次谐波含有率 CMD_AFN_C_F58_CURT_HARM_RATE 111 | CMD_FRTH_HAVE_POWR_C, // 当前正向有功电能示值(总、费率1~M) CMD_AFN_C_F129_FRTH_HAVE_POWR_C 112 | CMD_FRTH_NONE_POWR_C, // 当前正向无功(组合无功1)电能示值(总、费率1~M) CMD_AFN_C_F130_FRTH_NONE_POWR_C 113 | 114 | /* 请示2类数据 (AFN = 0DH) */ 115 | CMD_UBLN_OVER_D, // 日不平衡度越限累计时间 日冻结 数据结构 sMtUblnOverD 对应命令 CMD_AFN_D_F28_UBLN_OVER_D 116 | CMD_UBLN_OVER_M, // 月不平衡度越限累计时间 月冻结 数据结构 sMtUblnOverM 对应命令 CMD_AFN_D_F36_UBLN_OVER_M 117 | 118 | 119 | // 读取温度与湿度以下两个命令为暂时替代性命令,后续可能会变 120 | CMD_NELC_TEMP, // 读取温度 CMD_AFN_C_F17_TOTAL_POWER_HAVE 121 | CMD_NELC_HUMi, // 读取湿度 CMD_AFN_C_F18_TOTAL_POWER_NONE 122 | 123 | 124 | CM_CMD_MAX, // 最大命令 125 | }eCmCmd; // contrator to master cmd 集中器到主站的命令 126 | 127 | 128 | 129 | 130 | /**************************************************** 131 | * 132 | * 逐条确认与否认数据结构 133 | * 134 | {*/// 135 | typedef struct 136 | { 137 | eCmCmd eCmd; // 命令 138 | UINT16 usPN; // 测量点号 139 | BOOL bOk; 140 | }sCmOne; 141 | 142 | typedef struct 143 | { 144 | UINT8 ucNum; // 需要确认或否认的子命令个数 145 | sCmOne sOne[1]; // 每条确认与否认数据 146 | }sCmOneByOne; 147 | ///*} 148 | 149 | 150 | /**************************************************** 151 | * 数据结构: 终端或集中器支持的参数配置 152 | * 对应数据: sMtSuptParaCfg 153 | * 154 | {*/// 155 | typedef struct 156 | { 157 | UINT8 ucNum; // 支持的配置的参数的个数 158 | eCmCmd eCfgCmd[1]; // 支持的配置 对应设置参数下的命令 159 | 160 | }sCmSuptParaCfg; 161 | 162 | ///*} 163 | 164 | /**************************************************** 165 | * 数据结构: 终端支持的控制配置 166 | * 对应数据: sMtSuptCtrlCfg 167 | * 168 | {*/// 169 | typedef struct 170 | { 171 | UINT8 ucNum; // 支持的控制命令的个数 172 | eCmCmd eCfgCmd[1]; // 支持的控制命令的命令字 CMD_CTRL_CHECK_TIME 到 CMD_AUTO_REPORT_STOP 173 | 174 | }sCmSuptCtrlCfg; 175 | ///*} 176 | 177 | 178 | /**************************************************** 179 | * 数据结构: 终端支持的1类数据配置 180 | * 对应数据: sMtSuptAsk1 181 | * 182 | {*/// 183 | typedef struct 184 | { 185 | UINT8 ucNum; // 终端支持的1类数据配个数 186 | eCmCmd eCfgCmd[1]; // ucNum 个命令 CMD_CURNT_PQUI 到 187 | 188 | }sCmSuptAsk1; 189 | ///*} 190 | 191 | 192 | /**************************************************** 193 | * 数据结构: 终端支持的2类数据配置 194 | * 对应数据: sMtSuptAsk2 195 | * 对应命令: CMD_SUPPORT_ASK2_CFG 196 | * 197 | {*/// 198 | typedef struct 199 | { 200 | UINT8 ucNum; // 终端支持的1类数据配个数 201 | eCmCmd eCfgCmd[1]; // ucNum 个命令 CMD_CURNT_PQUI 到 202 | 203 | }sCmSuptAsk2; 204 | 205 | ///*} 206 | 207 | /**************************************************** 208 | * 数据结构: 1类数据配置设置 209 | * 对应数据: CMD_CFG_ASK_1 CMD_CFG_ASK_1_Q 210 | * 211 | {*/// 212 | typedef struct 213 | { 214 | UINT8 ucSmall; // 用户小类号 215 | UINT8 ucFN; // 支持的命令个数 0 ~ 248 216 | eCmCmd eCmd[MT_FN_MAX]; // 支持的一类数据命令码 CMD_AFN_C_F2_TML_CLOCK 到 CMD_AFN_C_F170_READ_METER 217 | }sCmAsk1CfgOne; 218 | 219 | typedef struct 220 | { 221 | UINT8 ucBig; // 用户小类号 222 | UINT8 ucM; // 本次设置的组数m(m≤该用户大类号下支持的用户小类号个数) 223 | sCmAsk1CfgOne sOne[1]; // M个信息 224 | 225 | }sCmAsk1Cfg; 226 | ///*} 227 | 228 | /**************************************************** 229 | * 数据结构: 2类数据配置设置 230 | * 对应数据: CMD_CFG_ASK_2 CMD_CFG_ASK_2_Q 231 | * 232 | {*/// 233 | typedef struct 234 | { 235 | UINT8 ucSmall; // 用户小类号 236 | UINT8 ucFN; // 支持的命令个数 0 ~ 248 237 | eCmCmd eCmd[MT_FN_MAX]; // 支持的一类数据命令码 CMD_AFN_D_F1_FRTH_POWR_P1P4_D 到 CMD_AFN_D_F218_COLOR_YAWP_CURVE 238 | }sCmAsk2CfgOne; 239 | 240 | typedef struct 241 | { 242 | UINT8 ucBig; // 用户小类号 243 | UINT8 ucM; // 本次设置的组数m(m≤该用户大类号下支持的用户小类号个数) 244 | sCmAsk2CfgOne sOne[1]; // M个信息 245 | 246 | }sCmAsk2Cfg; 247 | ///*} 248 | 249 | /**************************************************** 250 | * 数据结构: 定时上报1 2类数据任务 设置、查询应答 251 | * 对应数据: sMtCfgAuto_1 sMtCfgAuto_2 252 | * 对应命令: sCmCfgAuto_1 : CMD_CFG_AUTO_1 和 CMD_CFG_AUTO_1_Q 253 | * 对应命令: sCmCfgAuto_2 : CMD_CFG_AUTO_2 和 CMD_CFG_AUTO_2_Q 254 | * 255 | {*/// 256 | typedef struct 257 | { 258 | eCmCmd eCmd; 259 | UINT16 usPn; 260 | 261 | }sCmCmdPn; 262 | 263 | typedef struct 264 | { 265 | eMtRptUnit eUnit; // 定时上报周期单位(分、时、日、月) 266 | UINT8 ucPeriod; // 定时上报周期 267 | sMtYWMDhms sTime; // 上报基准时间:秒分时日月年 268 | UINT8 ucR; // 曲线数据抽取倍率R (1~96) 269 | UINT8 ucN; // 数据单元标识个数n 270 | sCmCmdPn sCmdPn[1]; // N个数据单元标识 271 | 272 | }sCmCfgAuto_1, sCmCfgAuto_2; 273 | ///*} 274 | 275 | /**************************************************** 276 | * 数据结构: 暂时替代命令 277 | * 对应数据: sMtTotalPowerHave 278 | * 对应命令: CMD_NELC_TEMP CMD_NELC_HUMi 279 | * 对应命令: CMD_AFN_C_F17_TOTAL_POWER_HAVE CMD_AFN_C_F18_TOTAL_POWER_NONE 280 | * 281 | {*/// 282 | typedef sMtTotalPowerHave sMcNelcTmper; // 温度 283 | typedef sMtTotalPowerNone sMcNelcHumit; // 湿度 284 | ///*} 285 | 286 | typedef union 287 | { 288 | // 上下行通用 289 | sCmOneByOne scmOneByOne; // 逐条确认与否认 CMD_ONE_BY_ONE 290 | sMtTmlUpCfg sTmlUpCfg; // 终端上行通信口通信参数设置 CMD_CFG_TML_UP 291 | sMtTmlPowerCfg sTmlPowerCfg; // 终端电能表/交流采样装置配置参数 CMD_CFG_TML_POWER 292 | sCmAsk1Cfg sAsk1Cfg; // 设置参数 CMD_CFG_ASK_1 和 查询参数 CMD_CFG_ASK_1_Q 293 | sCmAsk2Cfg sAsk2Cfg; // 设置参数 CMD_CFG_ASK_2 和 查询参数 CMD_CFG_ASK_2_Q 294 | sCmCfgAuto_1 sCfgAuto_1; // 定时上报1类数据任务 设置、查询应答 CMD_CFG_AUTO_1 CMD_CFG_AUTO_1_Q 295 | sCmCfgAuto_2 sCfgAuto_2; // 定时上报2类数据任务 设置、查询应答 CMD_CFG_AUTO_2 CMD_CFG_AUTO_2_Q 296 | sMtGopAuto_1 sGoAuto_1; // 定时上报1类数据任务启动/停止设置 CMD_GO_AUTO_1 CMD_GOP_AUTO_1_Q 297 | sMtGopAuto_2 sGoAuto_2; // 定时上报1类数据任务启动/停止设置 CMD_GO_AUTO_2 CMD_GOP_AUTO_2_Q 298 | 299 | // 上行特有 集中器到主站 300 | sMtTmlVersion sTmlVersion; // 终端版本信息 CMD_AFN_TML_VERSION 301 | sMtTmlInputOut sTmlInputOut; // 终端支持的输入、输出及通信端口配置 CMD_AFN_TML_INPUT_OUT 302 | sMtTmlOtherCfg sTmlOtherCfg; // 终端支持的其他配置 CMD_TML_OTHER_CFG 303 | sCmSuptParaCfg sTmlSuptParaCfg; // 终端支持的参数配置 CMD_SUPPORT_PARA_CFG 304 | sCmSuptCtrlCfg sTmlSuptCtrlCfg; // 终端支持的控制配置 CMD_SUPPORT_CTRL_CFG 305 | sCmSuptAsk1 sTmlSuptAsk1; // 终端支持的1类数据配置 CMD_SUPPORT_ASK1_CFG 306 | sCmSuptAsk2 sTmlSuptAsk2; // 终端支持的2类数据配置 CMD_SUPPORT_ASK2_CFG 307 | sMtSuptEvent sTmlSuptEvent; // 终端支持的事件记录配置 CMD_SUPPORT_EVNT_CFG 308 | sMtUserClock sTmlClock; // 终端日历时钟 CMD_TML_CLOCK 309 | sMtCurPQUI sCurPQUI; // 当前三相及总有/无功功率、功率因数,三相电压、电流、零序电流、视在功率 CMD_CURNT_PQUI 310 | 311 | sMtUblnOverD sUblnOverD; // 日冻结 日不平衡度越限累计时间 CMD_UBLN_OVER_D 312 | sMtUblnOverM sUblnOverM; // 月冻结 月不平衡度越限累计时间 CMD_UBLN_OVER_M 313 | float fDcRltmData; // 直流模拟量实时数据 (仅3位有效数据) CMD_DC_RLTM_DATA CMD_AFN_C_F73_DC_RLTM_DATA 314 | sMtCurPower sCurPower; // 当前A、B、C三相正/反向有功电能示值、组合无功1/2电能示值 CMD_POWER_CUR 315 | sMtCurtHarmValue sTmlCurtHarmValue; // 当前A、B、C三相电压、电流2~N次谐波有效值 CMD_CURT_HARM_VALUE CMD_AFN_C_F57_CURT_HARM_VALUE 316 | sMtCurtHarmRate sTmlCurtHarmRate; // 当前A、B、C三相电压、电流2~N次谐波含有率 CMD_CURT_HARM_RATE CMD_AFN_C_F58_CURT_HARM_RATE 317 | sMtFrthHavePower sTmlFrthHavePowrC; // 当前正向有功电能示值(总、费率1~M) CMD_FRTH_HAVE_POWR_C CMD_AFN_C_F129_FRTH_HAVE_POWR_C 318 | sMtFrthNonePower sTmlFrthNonePowrC; // 当前正向无功(组合无功1)电能示值(总、费率1~M)CMD_FRTH_NONE_POWR_C CMD_AFN_C_F130_FRTH_NONE_POWR_C 319 | sMcNelcTmper sNelcTmper; // 温度 CMD_NELC_TEMP 320 | sMcNelcHumit sNelcHumit; // 温度 CMD_NELC_HUMi 321 | 322 | 323 | // 下行特有 主站到集中器 324 | sMtUserClock sCheckTime; // 对时命令 CMD_CTRL_CHECK_TIME 325 | sMtTmlPowerCfg_Q sTmlPowerCfg_Q; // 终端电能表/交流采样装置配置参数 命令参数 CMD_CFG_TML_POWER_Q 326 | sMtAsk1Cfg_Q sAsk1Cfg_Q; // 1类数据配置设置 (在终端支持的1类数据配置内)(查询命令参数) CMD_CFG_ASK_1_Q 327 | sMtAsk2Cfg_Q sAsk2Cfg_Q; // 1类数据配置设置 (在终端支持的2类数据配置内)(查询命令参数) CMD_CFG_ASK_2_Q 328 | sMtTd_c sTd_c; // 曲线类数据时标 命令参数 329 | sMtTd_h sTd_h; // 小时冻结 命令参数 330 | sMtTd_d sTd_d; // 日冻结 命令参数 331 | sMtTd_m sTd_m; // 月冻结 命令参数 332 | 333 | 334 | }uCmApp; // 用户侧应用层数据 与 uMtApp 一一对应 335 | 336 | 337 | typedef struct 338 | { 339 | eCmCmd eCmd; // 子命令字 340 | UINT16 usPN; // 子命令字一级参数 341 | BOOL bApp; // 应用层数据时有时无 342 | uCmApp uAppData; // 应用层数据 联合 343 | }sCmSub; // 子命令数据结构 344 | 345 | 346 | /* 347 | * 定义解析与封装共用数据结构, 集中器调用 348 | * 说明: 349 | * (1)每一个有效帧中,只包含一种主cmd类型的报文 350 | * (2)每一个有效帧中,可以包含多个对应于主cmd类型的子cmd类型的数据域 351 | * 个数最少一个,可以多个,且多个时候可以任意顺序组合 352 | * (3)每个subcmd类型下可能有数据,可以无应用层数据域 353 | */ 354 | typedef struct 355 | { 356 | sMtAddress sAddress; // 地址信息 357 | BOOL bReSend; // 是否为重发 TRUE 重发的帧计数不会自动增加1 FALSE 会自增1 358 | BOOL bActive; // 是否为主动上报 (仅登录、心跳、退出登录、1类2类数据主动上报时为真) 359 | UINT8 ucCmdNum; // 该包中含有子命令的个数 最少有一个子命令 360 | sCmSub sCmdData[1]; // 每条子命令的内容 361 | 362 | }sCmPacket; 363 | 364 | typedef struct 365 | { 366 | eMtRole eRole; // 身份 367 | UINT8 ucPermitDelayMinutes; // 允许时延 368 | 369 | }sCmInit; // 3761协议层初始化数据结构 370 | 371 | eMtAFN ecmGetCmdAfn(eCmCmd eCmd); 372 | 373 | // 上层调用本模块前,保确实进行初始化 374 | eCmErr ecm_3761_init(sCmInit * psCmInit); 375 | // 上层接口封装 376 | INT32 ncm_3761_pack(sCmPacket* psCmPacket, UINT8 * pBuf); 377 | INT32 ncm_3761_unpack(UINT8 * pBuf, UINT16 usBufLen, sCmPacket* psCmPacket); 378 | INT32 ncm_3761_checkAndGetPacket(UINT8 *pinBuf, UINT16 usLen, UINT16 *pusFirstOff, UINT16 *pusFirstLen); 379 | 380 | 381 | // 封装函数 382 | eCmErr ecm_3761_pack(sCmPacket* psCmPacket, UINT8 * pBuf, UINT16 *pusBufLen); 383 | 384 | // 解封装函数 385 | eCmErr ecm_3761_unpack(UINT8 * pBuf, UINT16 usBufLen, sCmPacket* psCmPacket); 386 | 387 | // 判断是否为一个有效帧 388 | BOOL bcm_valid_3761_packet(UINT8 *pinBuf, UINT16 usLen); 389 | 390 | 391 | // 找到第一个有效帧的位置 392 | eCmErr ecm_find_frist_valid_pack(UINT8 *pinBuf, UINT16 usLen, UINT16 *pusFirstOff, UINT16 *pusFirstLen); 393 | 394 | // 设计事件计数器 395 | void vCmSetEC(UINT8 ucEC1, UINT8 ucEC2); 396 | 397 | // 设置密码 398 | BOOL bCmSetPw(char *pw); 399 | 400 | // 内部接口 401 | eMtCmd emtTransAppData_cm_2_mt(eMtCmd emtCmd, uCmApp *pcmAppData, uMtApp *pmtAppData); 402 | eMtCmd emtTransAppData_mt_2_cm(eMtCmd emtCmd, uMtApp *pmtAppData, uCmApp *pcmAppData); 403 | 404 | eMtCmd eGetMtCmd(eCmCmd cmCMD); 405 | eCmCmd eGetCmCmd(eMtCmd mtCMD); 406 | eMtPRM ecmGetPrm(eCmCmd cmCMD); // 获得该命令的主动性 407 | 408 | typedef struct 409 | { 410 | eCmCmd ecmCMD; 411 | eMtCmd emtCMD; 412 | eMtPRM ePrm; // 集中器封装该命令时的主动性 413 | 414 | }sCmdMap; // 命令映射 415 | 416 | #pragma pack(pop) // 一字节对齐 417 | #endif /* _CON_3761_ADP_H_ */ 418 | --------------------------------------------------------------------------------