文章目录
- 参考
- Modbus 协议简介
-
- 查询—回应周期
- modbus RTU
-
- RTU 模式
- RTU 帧
- modbus功能码简述
-
- 功能码说明
- 寄存器地址分配
- 寄存器种类说明
- PLC地址和协议地址区别
- 寄存器PLC地址
- 寄存器协议地址
- 应用举例-读保持寄存器03H
-
- 模拟数据
- 响应
参考
MODBUS协议整理——汇总
Modbus 协议简介
-
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
-
此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。
-
当在一 Modbus 网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用 Modbus 协议发出。在其它网络上,包含了 Modbus 协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
查询—回应周期
- 查询
查询消息中的功能代码告之被选中的从设备要执行何种功能。
数据段包含了从设备要执行功能的任何附加信息。
例如功能代码 03 是要求从设备读保持寄存器并返回它们的内容。
数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。
错误检测域为从设备提供了一种验证消息内容是否正确 - 回应
如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。
数据段包括了从设备收集的数据:寄存器值或状态。
如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。
错误检测域允许主设备确认消息内容是否可用。
modbus RTU
RTU 模式
当控制器设为在 Modbus 网络上以 RTU(远程终端单元)模式通信,在消息中的每个 8Bit 字节包含两
个 4Bit 的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比 ASCII 方式传送更多的数据。
- 代码系统
8 位二进制,十六进制数 0…9,A…F
消息中的每个 8 位域都是一个两个十六进制字符组成 - 每个字节的位
1 个起始位
8 个数据位,最小的有效位先发送
1 个奇偶校验位,无校验则无 1 个停止位(有校验时),2 个 Bit(无校验时) - 错误检测域
CRC(循环冗长检测)
RTU 帧
使用 RTU 模式,消息发送至少要以 3.5 个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的 T1-T2-T3-T4 所示)。传输的第一个域是设备地址。可以使用的传输字符是十
六进制的 0…9,A…F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收
到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少 3.5 个字符时间的
停顿标定了消息的结束。一个新的消息可在此停顿后开始。
整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过 1.5 个字符时间的停顿时间,接收设
备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于 3.5 个字
符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的
CRC 域的值不可能是正确的。一典型的消息帧如下所示:
(1)地址域(Addr):8位数据,表示有效的从机设备地址范围0-247;
(2)功能域(Func):当主机向从机发送查询信息时,功能码命令从机执行相应功能;当从机响应主机,功能码表示从机正常响应或者出现异常。
(3)数据域:主机查询从机时,数据域包含读取寄存器起始地址和读取寄存器数量,16位有效,高字节在前,低字节在后。从机响应主机时,数据域包含接收数据字节数量(8位有效)和接收的数据(16位有效,高字节在前,低字节在后)。
(4)错误校验域:使用CRC16校验,16位有效,高字节在前,低字节在后。
modbus功能码简述
下表列出MODBUS支持的部分功能代码:以十进制表示。
代码 |
中文名称 |
寄存器PLC地址 |
位操作/字操作 |
操作数量 |
01 |
读线圈状态 |
00001-09999 |
位操作 |
单个或多个 |
02 |
读离散输入状态 |
10001-19999 |
位操作 |
单个或多个 |
03 |
读保持寄存器 |
40001-49999 |
字操作 |
单个或多个 |
04 |
读输入寄存器 |
30001-39999 |
字操作 |
单个或多个 |
05 |
写单个线圈 |
00001-09999 |
位操作 |
单个 |
06 |
写单个保持寄存器 |
40001-49999 |
字操作 |
单个 |
15 |
写多个线圈 |
00001-09999 |
位操作 |
多个 |
16 |
写多个保持寄存器 |
40001-49999 |
字操作 |
多个 |
功能码说明
功能码可以分为位操作和字操作两类。位操作的最小单位为BIT,字操作的最小单位为两个字节。
【位操作指令】 读线圈状态01H,读(离散)输入状态02H,写单个线圈06H和写多个线圈0FH。
【字操作指令】 读保持寄存器03H,写单个寄存器06H,写多个保持寄存器10H。
寄存器地址分配
表1.2 MODBUS寄存器地址分配
寄存器PLC地址 |
寄存器协议地址 |
适用功能 |
寄存器种类 |
读写状态 |
00001-09999 |
0000H-FFFFH |
01H 05H 0FH |
线圈状态 |
可读可写 |
10001-19999 |
0000H-FFFFH |
02H |
离散输入状态 |
可读 |
30001-39999 |
0000H-FFFFH |
04H |
输入寄存器 |
可读 |
40001-49999 |
0000H-FFFFH |
03H 06H 0FH |
保持寄存器 |
可读可写 |
寄存器种类说明
PLC地址和协议地址区别
PLC地址可以理解为协议地址的变种,在触摸屏和PLC编程中应用较为广泛。
寄存器PLC地址
寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以使触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代码寄存器类型。第一位数字和寄存器类型的对应关系如表1所示。PLC地址例如40001、30002等。
寄存器协议地址
寄存器协议地址指指通信时使用的寄存器地址,例如PLC地址40001对应寻址地址0x0000,40002对应寻址地址0x0001,寄存器寻址地址一般使用16进制描述。再如,PLC寄存器地址40003对应协议地址0002,PLC寄存器地址30003对应协议地址0002,虽然两个PLC寄存器寄存器通信时使用相同的地址,但是需要使用不同的命令访问,所以访问时不存在冲突。
应用举例-读保持寄存器03H
表1 数据输出项目与格式要求
- 说明
读保持寄存器。可读取单个或多个保持寄存器。 - 查询
从机地址为01H。保持寄存器的起始地址为0000H,该次查询总共访问13个保持寄存器。
模拟数据
查询:01 03 00 00 00 0d 84 0f
响应
应答:01 03 1A 07 3F 03 23 00 0E 00 1C 2E 3F 01 2F 03 25 04 3F 05 1B 01 2C 00 3F 01 2F 00 10 DA 46