Modbus 优点
- 免费公开——
- 简单易懂——
- 方便修改——
名词解释
- ADU 应用数据单元(Application Data Unit)
- PDU 协议数据单元(Protocol Data Unit)
按照 7 层 OSI 通信模型, Modbus 标准包括应用层、数据链路层、物理层。
Modbus 串行链路协议是一个主/从协议。该协议位于 OSI 模型的第二层。
一个主从类型的系统有一个向某个“子”节点发出显式命令并处理响应的节点(主节点)。典型的子节
点在没有收到主节点的请求时并不主动发送数据,也不与其它子节点通信。
在物理层, Modbus 串行链路系统可以使用不同的物理接口(RS485、 RS232)。最常用的是 TIA/EIA-485 (RS485) 两线制接口。
Modbus 主站/从站协议原理
Modbus 串行链路协议是一个主-从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点 (最大编号为 247 ) 连接于同一个串行总线。
- Modbus 通信总是由主节点发起。
- 子节点在没有收到来自主节点的请求时,从不会发送数据。子节点之间从不会互相通信。主节点在同一时刻只会发起一个Modbus 事务处理。
主节点以两种模式对子节点发出 Modbus 请求:
- 单播模式
主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个’应答’)。在这种模式,一个 Modbus 事务处理包含 2 个报文:一个来自主节点的请求,一个来自子节点的应答。
每个子节点必须有唯一的地址 (1 到 247),这样才能区别于其它节点被独立的寻址。
- 广播模式
主节点向所有的子节点发送请求。对于主节点广播的请求没有应答返回。
- 广播请求一般用于写命令。
- 所有设备必须接受广播模式的写功能。
- 地址 0 是专门用于表示广播数据的。
地址规则:
Modbus 寻址空间有 256 个不同地址。
0 | 1~247 | 248~255 |
---|---|---|
广播地址 | 子节点单独地址 | 保留 |
地址 0 为广播地址。所有的子节点必须识别广播地址。
Modbus 主节点没有地址,只有子节点必须有一个地址。 该地址必须在 Modbus 串行总线上唯一。
Modbus 帧描述
Modbus 协议定义了一个与基础通信层无关的简单协议数据单元(PDU-Protocol Data Unit)
而在特定总线或网络上的 MODBUS 协议通过引入一些附加域,在协议数据单元(PDU)上增加必要的前缀(如地址域)和后缀(如差错校验),形成了应用数据单元(ADU)
通信 PDU = Modbus PDU + 地址域 + 校验域。
- 在 Modbus 串行链路,地址域只含有子节点地址。
- 如前文所述,合法的子节点地址为十进制 0 – 247。 每个子设备被赋予 1 – 247 范围中的地址。
- 主节点通过将子节点的地址放到报文的地址域对子节点寻址。
- 当子节点返回应答时,它将自己的地址放到应 答报文的地址域以让主节点知道哪个子节点在回答。
- 功能码指明服务器要执行的动作。功能码后面可跟有表示含有请求和响应参数的数据域。
- 数据:传输的数据内容,在某种请求中,数据可以是不存在的(0 长度),在此情况下服务器不需要任何附加信息,功能码仅说明操作。
- 错误检验域是对报文内容执行 “冗余校验” 的计算结果。根据不同的传输模式 (RTU or ASCII) 使用两种不同的计算方法。RTU 模式使用 CRC 校验。
地址域
所谓地址域,指的是 Modbus 通信帧中的地址字段,其内容为从设备地址。 Modbus 消息帧的地址域包含 2 个字符(ASCII模式)或者 1 个字节(RTU模式) 。
消息帧中可能的从设备地址是0~247(十进制),单个设备的实际地址范围是1~247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备做出回应。
地址0用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高级别的网络时,广播方式可能不被允许或以其他方式代替。
功能码域
功能码域由 1 个字节构成,因此其取值范围为 1~255(十进制)。
从设备根据功能码执行对应的功能,执行完成后:
- 正常情况下,在返回的响应消息帧中设置同样的功能码;
- 如果出现异常,则在返回的消息帧中将功能码最高位(MSB)设置为 1。据此,主设备可获知对应从设备的执行情况。
另外,对于主设备发送的功能码,则从设备根据具体配置来决定是否支持此功能码。如果不支持,则返回异常响应。
数据域
数据域与功能码紧密相关,存放功能码操作需要的具体数据。数据域以字节为单位,长度是可变的,对于有些功能码,数据域可以为空。
Modbus 的两种传输模式
Modbus 有两种串行传输模式被定义: RTU(Remote Terminal Unit) 远程终端单元模式 和 ASCII 模式。
传输模式定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和如何解码。Modbus 串行链路上所有设备的传输模式 (和串行口参数) 必须相同。
尽管在特定的领域 ASCII 模式是要求的,但达到 Modbus 设备之间的互操作性只有每个设备都有相同的模式: 所有设备必须实现 RTU 模式。 ASCII 传输模式是选项。
当设备使用 RTU (Remote Terminal Unit) 模式在 Modbus 串行链路通信,报文中每个 8 位字节含有两个 4 位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比 ASCII 模式有更高的吞吐率。 每个报文必须以连续的字符流传送。
RTU 模式每个字节 ( 11 位 ) 的格式为 :
- 编码系统: 8 位二进制, 报文中每个 8 位字节含有两个 4 位十六进制字符(0–9, A–F)
- 每字节的 bit 流:
- 1 起始位
- 8 数据位, 首先发送最低有效位
- 1 位作为奇偶校验
- 1 停止位
- 偶校验是要求的, 其它模式 ( 奇校验, 无校验 ) 也可以使用。 为了保证与其它产品的最大兼容性,同时支持无校验模式是建议的。默认校验模式模式必须为偶校验。
- 注 : 使用无校验要求 2 个停止位。
Modbus 寄存器概念
Modbus协议中一个重要的概念是寄存器,所有的数据均存放于寄存器中。最初 Modbus 协议借鉴了 PLC 中寄存器的含义,但是随着 Modbus 协议的广泛应用,寄存器的概念进一步泛化,不再是指具体的物理寄存器,也可能是一块内存区域。 Modbus 寄存器根据存放的数据类型以及各自读写特性,将寄存器分为4个部分,这4个部分可以连续也可以不连续,由开发者决定。
寄存器种类 | 说明 | 与PLC类比 | 举例说明 |
---|---|---|---|
线圈状态 (Coil Status) |
输出端口。 可设定端口的输出状态,也可以读取该位的输出状态。 可分为两种不同的执行状态,例如保持型或边沿触发型 |
||
离散输入状态 (Input Status) |
输入端口。 通过外部设定改变输入状态,可读但不可写 |
||
功能码
04(0x04)读取输入寄存器值
消息帧中指定了需读取的输入寄存器的起始地址和数目。而输入寄存器中各地址的具体内容和意义,则由开发者自行规定。
本功能码中,起始地址由 2 个字节构成取值范围为 0x0000~0xFFFF0;
寄存器数量由2个字节构成,取值范围为0x0001~0x007D(即十进制1~125),即最多可以连续读取125个寄存器。
同样有一点需要注意, Modbus的保持寄存器和输入寄存器是以字为基本单位的。所以对于浮点数(或者32位的整数)而言,连续读取的两个寄存器之间存在字节序和大小端的问题。这一点在开发时必须引起注意。
参考链接
一文看懂Modbus协议
Modbus协议解析—小白一看就懂的协议
《Modbus 软件开发实战指南》杨更更著
深入理解Modbus协议的数据模型和地址模型