Realization of Modbus/TCP Protocol Library Functions Across Embedded Platforms
-
摘要: 为了在不同的国产化中央处理器(CPU)上应用Modbus/TCP协议,需设计并实现跨平台协议库函数。根据Modbus应用协议规格说明书,在不依赖操作系统调用的前提下,对Modbus/TCP协议需支持的十大功能码进行跨平台库函数开发。库函数可被通讯应用层根据自身需求用于Modbus/TCP协议客户端和服务器端的设计和开发。经过在国产化CPU和嵌入式平台上进行二次开发,开发者调用本研究中的库函数能有效实现通过Modbus/TCP协议对反应堆冷却剂系统的稳压器压力水位及棒控棒位系统的功率调节进行数据采集。
-
关键词:
- 国产化 /
- 跨平台 /
- Modbus/TCP协议 /
- 嵌入式开发
Abstract: In order to apply Modbus/TCP protocol in different localized CPUs, it is necessary to design and realize cross-platform protocol library functions. According to the specification of Modbus application protocol, the cross-platform library functions of the ten function codes that Modbus/TCP protocol needs to support are developed without relying on operating system calls. The library functions can be used by the communication application layer for the design and development of Modbus/TCP protocol client and server according to its own needs. After secondary development on localized CPU and embedded platform, by calling the library function in this study, the developer can effectively collect the data of the pressurizer pressure and water level of the reactor coolant system and the power regulation of the rod control system through the Modbus/TCP protocol.-
Key words:
- Localization /
- Cross platforms /
- Modbus/TCP protocol /
- Embedded development
-
表 1 MBAP
Table 1. MBAP
字节
序号字段名 说明 请求时 响应时 0 Trans.
ID传输标识(Hi①) Modbus请求/响
应事务的标识符生成 从请求报
文中复制1 传输标识(Lo②) 2 Prot.
ID协议标识(Hi) 0③为Modbus协议 生成 从请求报
文中复制3 协议标识(Lo) 4 Length 字节长度(Hi) 字节序号6开始
及之后的字节数量生成 重新生成 5 字节长度(Lo) 6 Unit ID 单元标识符 串行链路或其他
总线上连接的远程
从站识别码生成 从请求报
文中复制注:①Hi—高地址字节;②Lo—低地址字节;③0—Modbus/TCP协议在网络应用层协议号 表 2 0x01/ 0x02功能码请求/响应PDU结构
Table 2. 0x01/ 0x02 Function Code Requesting / Responding PDU Structure
字节
序号请求报文 正常响应报文 异常响应报文 7 功能码 功能码 功能码+0x80 8 读开始地址(Hi) 字节数(N①) 异常码 9 读开始地址(Lo) 线圈/离散
输入状态—③ 10 读线圈/离散输入
个数②(Hi)11 读线圈/离散输入
个数②(Lo)$\cdots $ — 9+N−1 注:①N=线圈(或离散输入)个数/8,如果余数为0,则N=N+1;②线圈/离散输入个数范围:1~2000;③“—”表示无此项,下同 表 3 0x03/0x04功能码请求/响应PDU格式
Table 3. 0x03/0x04 Function Code Requesting / Responding PDU Format
字节
序号请求报文 正常响应
报文异常响应
报文7 功能码 功能码 功能码+0x80 8 读开始地址(Hi) 字节数(N①) 异常码 9 读开始地址(Lo) 输入/保持
寄存器值— 10 读输入/保持寄存
器个数②(Hi)11 读输入/保持寄存
器个数(Lo)$\cdots $ — 9+N−1 注:①N=寄存器个数×2;②寄存器个数范围:1~125 表 4 0x05/0x06功能码请求/响应PDU格式
Table 4. 0x05/0x06 Function Code Requesting / Responding PDU Format
字节
序号请求报文 正常响应报文 异常响应报文 7 功能码 功能码 功能码+0x80 8 写开始地址(Hi) 写开始地址(Hi) 异常码 9 写开始地址(Lo) 写开始地址(Lo) — 10 写线圈/保持寄存
器值(Hi①)写线圈/保持寄存
器值(Hi)11 写线圈/保持寄存
器值(Lo)写线圈/保持寄存
器值(Lo)注:①待写线圈值只能为0xFF00或0x0000,分别表示ON或OFF;待写保持寄存器值范围为0x0000~0xFFFF 表 5 0x0F/0x10功能码请求/响应PDU格式
Table 5. 0x0F/0x10 Function Code Requesting / Responding PDU Format
字节
序号请求报文 正常响应报文 异常响应
报文7 功能码 功能码 功能码+0x80 8 写开始地址(Hi) 写开始地址(Hi) 异常码 9 写开始地址(Lo) 写开始地址(Lo) — 10 写线圈/保持寄存
器个数(Hi)写线圈/保持寄存
器个数(Hi)11 写线圈/保持寄存
器个数(Lo)写线圈/保持寄存
器个数(Lo)12 字节数(N①) — 13 线圈状态/寄存器值 … 13+N−1 注:①0x0F:N=线圈个数/8,如果余数为0,则N=N+1;单个报文可写线圈个数:1~1968;0x10:N=寄存器个数×2;单个报文可写寄存器个数:1~123 表 6 0x16功能码请求/响应PDU格式
Table 6. 0x16 Function Code Requesting / Responding PDU Format
字节
序号请求报文 正常响应报文 异常响应报文 7 功能码 功能码 功能码+0x80 8 写开始地址(Hi) 写开始地址(Hi) 异常码 9 写开始地址(Lo) 写开始地址(Lo) — 10 And①掩码(Hi) And掩码(Hi) 11 And掩码(Lo) And掩码(Lo) 12 Or②掩码(Hi) Or掩码(Hi) 13 Or掩码(Lo) Or掩码(Lo) 注:①And—与运算;②Or—或运算 表 7 0x17功能码请求/响应报文格式
Table 7. 0x17 Function Code Requesting / Responding Message Format
字节
序号请求报文 正常响应报文 异常响应报文 7 功能码 功能码 功能码+0x80 8 读开始地址(Hi) 字节数(M②) 异常码 9 读开始地址(Lo) 寄存器值 — 10 读寄存器个数(Hi) 11 读寄存器个数(Lo) 12 写开始地址(Hi) 13 写开始地址(Lo) 14 写寄存器个数(Hi) 15 写寄存器个数(Lo) 16 字节数(N①) 17 待写寄存器值 … 17+N−1 … — 9+M−1 注:①N=写寄存器个数×2;②M=读寄存器个数×2 表 8 异常码描述
Table 8. Exception Code Description
异常码 名字 描述 01 非法功能码 服务器端设备不支持此功能码 02 非法数据地址 客户端请求的地址非法 03 非法数据 客户端请求的数量/欲写入的数据
非法,或数量与字节数不匹配04 服务器端故障 服务器端设备出现未知错误等 表 9 服务器端寄存器类型所支持的功能码
Table 9. Function Codes Supported by Server-side Register Types
服务器端寄存器类型 所支持的功能码 线圈状态 0x01/0x05/0x0F 离散输入状态 0x02 保持寄存器 0x03/0x06/0x10/0x16/0x17 输入寄存器 0x04 表 10 库函数
Table 10. Library Functions
库函数名称 作用 InitModbusSlave 对服务器端进行初始化工作 ReadCoilQuery 客户端读取线圈的状态 ReadDiscreteInputsQuery 客户端读取离散量输出的状态 ReadHoldingRegisterQuery 客户端读取保持寄存器值 ReadInputRegisterQuery 客户端读取输入寄存器值 WriteSingleCoilQuery 客户端写单个线圈值 WriteSingleRegisterQuery 客户端写单个保持寄存器值 WriteMultipleCoilQuery 客户端写多个线圈值 WriteMultipleRegisterQuery 客户端写多个保持寄存器值 MaskWriteRegisterQuery 客户端使用掩码写保持寄存器 ReadWriteRegisterQuery 客户端连续读/写多个保持寄存器 HandleAllResponse 客户端处理响应并提取出数据 HandleAllQuery 服务器端对请求进行处理并传出响应报文 表 11 CAN协议所获取的原始数据
Table 11. Raw Data Obtained by CAN Protocol
反应堆功率调节器 反应堆压力水位调节器 运行工况 非法值 堆运行状态 运行 手动/自动 手动 稳压器压力宽/MPa 0 参考平均温度/℃ 240.00 稳压器压力窄/MPa 0 高选平均温度/℃ 180.00 稳压器水位宽/cm 0 蒸汽总流量/(t·h−1) 0 稳压器水位窄/cm 150.00 蒸汽压力/MPa 0 参考水位/cm 250.00 高选核功率/%满功率(FP) 0 — — 需求功率/%FP 42.00 — — -
[1] 束国刚,上官斌,何大波. 核电设备国产化推进工作实践[J]. 电力技术经济,2009, 21(3): 7-12. doi: 10.3969/j.issn.1674-8441.2009.03.002 [2] 庞宇翔,谢大蓉,朱毅明. Modbus通信协议在300MW核电站计算机系统中的设计与应用[J]. 核科学与工程,2009, 29(4): 371-378+384. doi: 10.3321/j.issn:0258-0918.2009.04.013 [3] 翁建年,张浩,彭道刚,等. 基于嵌入式ARM的Modbus/TCP协议的研究与实现[J]. 计算机应用与软件,2009, 26(10): 36-38+68. doi: 10.3969/j.issn.1000-386X.2009.10.012 [4] 柳青. 嵌入式系统中Modbus/TCP协议栈的设计和实现[J]. 机电产品开发与创新,2020, 33(6): 12-14. doi: 10.3969/j.issn.1002-6673.2020.06.004 [5] 宋潇潇,林小峰,宋春宁,等. 基于IEC标准的嵌入式控制器的MODBUS通信[J]. 计算技术与自动化,2007, 26(1): 53-55. doi: 10.3969/j.issn.1003-6199.2007.01.014 [6] MODBUS application protocol specification V1. 1b3[EB/OL]. (2012-4-26)[2021-04-02].https://modbus.org/specs.php. [7] MODBUS messaging on TCP/IP implementation guide V1.0[EB/OL]. (2006-10-24)[2021-04-02].https://modbus.org/specs.php. -