-
1 知识介绍
-
2 PPT
-
3 学习视频
-
4 测试
-
5 匠人匠心
一、Modbus通信协议的基本知识
Modbus是一种串行通信协议,是Modicon公司(既现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
基于串行链路的 Modbus 通信协议有两种传输模式,它们分别是 Modbus RTU 与 Modbus ASCII,这两种模式在数值数据表示和协议细节方面略有不同。Modbus RTU 是一种紧凑的, 采用二进制数据表示的方式,而 Modbus ASCII 的表示方式则更加冗长。在数据校验方面;Modbus RTU 采用循环冗余校验方式,而 Modbus ASCII 采用纵向冗余校验方式。另外,配置 为 Modbus RTU 模式的节点无法与 Modbus ASCII 模式的节点通信。
特性 | RTU模式 | ASCII模式 |
编码 | 二进制 | ASCII |
每个字符位数 | 起始位:1 bit 数据位:8 bit 奇偶检验位(可选):1位 停止位:1或2 | 起始位:1bit 数据位:7 bit 奇偶检验位(可选):1位 停止位:1或2 |
报文校验 | CRCY(循环冗余校验) | LRCY(纵向冗余校验) |
Modbus 是一种单主/多从的通信协议,即在同一时间里,总线上只能有一个主设备, 但可以有一个或多个(最多 247 个)从设备。主设备是指发起通信的设备,而从设备是接收 请求并做出响应的设备。在 Modbus 网络中,通信总是由主设备发起,而从设备没有收到来 自主设备的请求时,不会主动发送数据。ModBus 通信的请求与响应模型如图所示。在 Modbus 网络中,主设备向从设备发送 Modbus 请求报文的模式有两种:单播模式与广播模式。

单播模式:主设备寻址单个从设备。主设备向某个从设备发送请求报文,从设备接收并 处理完毕后向主设备返回一个响应报文。
广播模式:主设备向 Modbus 网络中的所有从设备发送请求报文,从设备接收并处理完毕后不要求返回响应报文。
正常响应时,响应功能码 与请求信息中的功能码相同。

发生异常时,功能码将被修改以指出响应消息是错误的。差错检测区允许主设备确认消息内容是否可用。

二、Modbus寄存器
寄存器是Modbus通信协议的一个重要组成部分,它用于存放数据。Modbus寄存器最初借鉴于PLC(Programmable Logical Controller,可编程控制器)。后来随着Modbus通信协议的发展,寄存器这个概念也不再局限于具体的物理寄存器,而是慢慢拓展到了内存区域范畴。
根据存放的数据类型及其读写特性,Modbus 寄存器被分为4种类型,如
寄存器种类 | 特性说明 | 实际应用 |
线圈状态 (Coil) | 输出端口(可读可写),相当于PLC的DO(数字量输出) | LED显示,电磁阀输出等 |
离散输入状态(Discrete Input) | 输入端口(只读),相当于PLC的DI(数字量输入) | 接近开关、拨码开关等 |
保持寄存器(Holding Register) | 输出参数或保持参数(可读可写),相当于PLC的AO(模拟量输出) | 模拟量输出设定值、PID运行参数、传感器报警阈值等 |
输入寄存器(Input Register) | 输入参数(只读),相当于PLC 的AI(模拟量输入) | 模拟量输入值 |
寄存器地址又分为PLC地址和Modbus地址,其中这四个寄存器的Modbus协议地址是相同的,为0000H~FFFFH,以十六进制数据表示。具体的PLC地址如
寄存器种类 | 寄存器PLC地址 | 寄存器Modbus协议地址 | 位/字操作 |
线圈状态 | 00001~09999 | 0000H~FFFFH | 位操作 |
离散输入状态 | 10001~19999 | 0000H~FFFFH | 位操作 |
保持寄存器 | 40001~49999 | 0000H~FFFFH | 字操作 |
输入寄存器 | 30001~39999 | 0000H~FFFFH | 字操作 |
三、Modbus的串行消息帧格式
在计算机网络通信中,帧(Frame)是数据在网络上传输的一种单位,帧一般由多个部分组合而成,各部分执行不同的功能。Modbus通信协议在不同的物理链路上的消息帧是有差异的,本节主要介绍串行链路上的Modbus消息帧格式,包括ASCII和RTU两种模式的消息帧。在ASCII模式中,消息以冒号字符开始,以回车换行符结束。消息帧的其它域可以使用的传输字符是十六进制的0~F。Modbus网络上的各设备都循环侦测起始位——冒号字符,当接收到起始位后,各设备都解码地址域并判断消息是否发给自己的。注意:两个消息帧之间的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型的ModbusASCII消息帧如
起始位 | 地址 | 功能代码 | 数据 | LRC校验 | 结束符 |
1个字符 | 2个字符 | 2个字符 | n个字符 | 2个字符 | 2个字符CR,LF |
在RTU模式中,消息的发送与接收以至少3.5个字符时间的停顿间隔为标志。Modbus网络上的各设备都不断地侦测网络总线,计算字符间的间隔时间,判断消息帧的起始点。当侦测到地址域时,各设备都对其进行解码以判断该帧数据是否发给自己的。另外,一帧报文必须以连续的字符流来传输。如果在帧传输完成之前有超过1.5字符时间的间隔,则接收设备将认为该报文帧不完整。一个典型的ModbusRTU消息帧如
起始位 | 地址 | 功能代码 | 数据 | CRC校验 | 结束符 |
字符 | 8位 | 8位 | n个8位 | 16位 | 字符 |
消息帧分为地址域、功能码域、数据域和差距校验四部分。地址域存放了Modbus通信帧中的从设备地址。Modbus ASCII消息帧的地址域包含2个字符,Modbus RTU消息帧的地址域长度为1个字节。在下行帧中,地址域表明只有符合地址码的从机才能接收由主机发送来的消息。上行帧中的地址域指明了该消息帧发自哪个设备。
功能码域用于表明一个Modbus信息帧的用途。当主设备向从设备发送信息时,功能码将告诉从设备需要执行哪些行为。
数据域与功能码紧密相关,存放功能码需要操作的具体数据。数据域以字节为单位,长度 是可变的。
差错校验是在数据通信过程中能发现或纠正差错,并把差错限制在尽可能小的允许范围内的技术和方法。常用的校验方法有:循环冗余码和奇偶校验码。
四、Modbus的功能码
部分常用的Modbus功能码如
代码 | 功能码名称 | 位/字操作 | 操作数量 |
01 | 读线圈状态 | 位操作 | 单个或多个 |
02 | 读离散输入状态 | 位操作 | 单个或多个 |
03 | 读保持寄存器 | 字操作 | 单个或多个 |
04 | 读输入寄存器 | 字操作 | 单个或多个 |
05 | 写单个线圈 | 位操作 | 单个 |
06 | 写单个保持寄存器 | 字操作 | 单个 |
从
从设备地址 | 功能码 | 起始地址 | 寄存器个数 | CRC校验 |
06 | 01 | 00 16 | 00 21 | 1C 61 |
响应报文和请求报文前两个都一样保持不变,但响应报文多了数据域字节数和数据域,前者是响应数据的长度,后者是具体的数据。CRC校验则是随着每个报文的不同而变化。
从设备地址 | 功能码 | 数据域字节数 | 5个数据 | CRC校验 |
06 | 01 | 05 | 23 88 24 C4 01 | ED 9C |
功能码02的请求报文和响应报文的结构和功能码01基本相同。
从设备地址 | 功能码 | 起始地址 | 寄存器个数 | CRC校验 |
04 | 02 | 00 77 | 00 1E | 48 4D |
从设备地址 | 功能码 | 数据域字节数 | 4个数据 | CRC校验 |
04 | 02 | 04 | AD B7 05 38 | 3C EA |
功能码03和功能码04的请求报文和响应报文的结构和功能码01基本相同。
从设备地址 | 功能码 | 起始地址 | 寄存器个数 | CRC校验 |
06 | 03 | 00 D2 | 00 04 | E5 87 |
从设备地址 | 功能码 | 数据域字节数 | 4个数据 | CRC校验 |
06 | 03 | 08 | 02 6E 01 F3 01 06 59 AB | 1E 6A |
从设备地址 | 功能码 | 起始地址 | 寄存器个数 | CRC校验 |
06 | 04 | 01 90 | 00 05 | 30 6F |
从设备地址 | 功能码 | 数据域字节数 | 4个数据 | CRC校验 |
06 | 03 | 0A | 1C E2 13 5A 35 DB 23 3F 56 E3 | 51 3A |
功能码05和功能码06与以上功能码略有区别,它们的第四部分不是寄存器个数了,而是变更数据。01~04功能码着重突出读数据,功能码05是写单个线圈,功能码06是写单个保持寄存器。
从设备地址 | 功能码 | 起始地址 | 变更数据 | CRC校验 |
04 | 05 | 00 98 | FF 00 | 0D 80 |
从设备地址 | 功能码 | 起始地址 | 变更数据 | CRC校验 |
04 | 05 | 00 98 | FF 00 | 0D 80 |
从设备地址 | 功能码 | 起始地址 | 变更数据 | CRC校验 |
03 | 06 | 00 82 | 02 AB | 68 DF |
从设备地址 | 功能码 | 起始地址 | 变更数据 | CRC校验 |
03 | 06 | 00 82 | 02 AB | 68 DF |

