开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
简介
modbus通讯协议是Modicon公司首先推出的协议。首先推出ModbusRTU和Modbus ASCII两种协议。后来施耐德公司收购modicon后推出了ModbusTCP协议。
国内工业通信里多数使用modbus。许多仪表的通信一般都会支持modbus一些的读取方式。
基于tcp,能够让表更快速的进入物联网了。
modbustcp属于应用层协议,应用程序仅需要关注数据数据格式即可。
默认使用的端口是502.
如果对更详细的modbus资料感兴趣,可以通过modbus.org/tech.php 下载更多资料。
一个最简单的主从设备连接结构如下图所示
工业现场仪表定位是slave,由slave创建tcp服务,对外提供服务。master作为tcp客户端,主动发起连接slave,请求或者写入数据。
创建tcp客户端或者服务端的流程不在本文中涉及,他是个通用的服务创建流程,和modbus协议无关。
modbus tcp数据格式
一个modbus tcp的基本通讯数据单元叫做 ADU(application Unit Data),ADU有 MBAP(Modbus Application Protocol)头和PDU(Protocol Data Unit)构成。 如下图
MBAP
MBAP由七个字节构成,用于请求和相应基本数据单元的相互匹配。0 1字节是业务标识码,在同一时刻只能存在唯一一个标识码;2 3字节是协议标识码(0x00表示modbus协议),4 5字节是从6字节开始算起数据单元的有效长度;6字节远程从站的标识码,就是从设备地址。如果slave直接连接设备,标识码是无用的,可以用0xff。
PDU
PDU第一个字节标识功能码,后续跟着N字节的有效数据。 常用功能码:
| 编码 | 描述 | 编码 | 描述 |
|---|---|---|---|
| 0x01 | 读线圈 | 0x05 | 写单个线圈 |
| 0x03 | 读保持寄存器 | 0x06 | 写单个寄存器 |
| 0x04 | 读输入寄存器 |
应答帧的数据格式是由请求帧决定的。
举例说明
举例讲解对保持寄存器(0x03)的读取,这也是工业现场使用最广泛的请求帧了。
- 请求 00 01 00 00 00 06 ff 03 00 00 00 02 (读起始地址0,读取两个寄存器)
- 响应 00 01 00 00 00 07 FF 03 04 00 00 00 26
解释:前七位相同的MBAP。
后续的字节是数据单元帧的pdu部分。
第一字节是功能码,读保持寄存器,第二个字节是说后面跟着的有效字节的个数,4刚好对应请求帧读取两个寄存器的要求。
数值是四个字节(00 00 00 26),四位字节的数值解析需要按照字节序解析数据,一般表都可以设置字节序。
测试工具
slave模拟工具 地址 modbustools.com/download.ht…
master工具,可以随意找一个tcp测试工具,我比较喜欢用的是 sokit,画面比较好看