写点什么

Modbus 协议在串行链路上的实现

发布于: 2021 年 04 月 14 日

1、串行链路通信简介

Modbus 协议标准定义了 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。它还将串行链路上的协议标准化,以便在一个主站和一个或多 个从站之间交换 Modbus 请求。 本博文的目的是表述串行链路上的 Modbus 协议,实现设备之间的互通。

Modbus 串行链路协议是一个主/从协议,该协议位于 OSI 模型的第二层,主/从协议系统:有一个向某个“子”节点发出显式命令并处理响应的节点(主节点)。典型的子节点在没有收到主节点的请求时并不主动发送数据,也不与其它子节点通信。Modbus 协议和 ISO/OSI 模型如下图所示:

在物理层,Modbus 串行链路系统可以使用不同的硬件物理接口(RS485、RS232)。最常用的是 TIA/EIA-485 (RS485) 两线制接口。作为附加的选项,也可以实现 RS485 四线制接口。当只需要短距离的点到点通信时,TIA/EIA-232-E (RS232) 串行接口也可以使用。

2、串行链路通信协议原理

Modbus 串行链路协议是一个主/从协议。 在同一时刻,只有一个主节点连接于总线,一个或多个子节点 (最大编号为 247 ) 连接于同一个串行总线。Modbus 通信总是由主节点发起,子节点在没 有收到来自主节点的请求时,从不会发送数据。子节点之间从不会互相通信。主节点在同一时刻只会发起一个 Modbus 事务处理。

主节点有两种模式对子节点发出 Modbus 请求,一种是单播模式,另一种是广播模式。

单播模式主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个 '应答')。 在这种模式, 一个 Modbus 事务处理包含 2 个报文: 一个来自主节点的请求, 一个来自子节点的应答。 每个子节点必须有唯一的地址 (1 到 247),这样才能区别于其它节点被独立的寻址。如下图所示:

广播模式主节点向所有的子节点发送请求,对于主节点广播的请求没有应答返回。,广播请求一般用于写命令,有设备必须接受广播模式的写功能,地址 0 是专门用于表示广播数据的。如下图所示:

Modbus 寻址空间有 256 个不同地址,地址 0 保留为广播地址, 所有的子节点必须识别广播地址。 Modbus 主节点没有地址, 只有子节点必须有一个地址。 该地址必须在 Modbus 串行总线上唯一。地址规则如下所示:

3、串行链路通信帧描述

串行链路上的 Modbus 结构必须符合通用 Modbus 帧协议要求,具体如下所示:

具体解析如下所示:

  • 地址域:在 Modbus 串行链路,地址域只含有子节点地址。合法的子节点地址为十进制 0 – 247。 每个子设备被赋予 1 – 247 范围中的地址。主节点通过将子节点的地址放到报文的地址域对子节点寻址。当子节点返回应答时, 它将自己的地 址放到应答报文的地址域以让主节点知道哪个子节点在回答;

  • 功能码:功能码指明服务器要执行的动作。功能码后面可跟有表示含有请求和响应参数的数据域;

  • 数据:收、发数据信息;

  • 校验:错误检验域是对报文内容执行 "冗余校验" 的计算结果,通常用 CRC 或者 LRC 校验,根据不同的传输模式 (RTU or ASCII)使用两种不同的计算方法。

4、RTU、ASCII 串行传输模式

Modbus 串行链路传输数据有两种模式,RTU 模式和 ASCII 模式,定义了报文域的位内容在线路上串行的传送,确定了信息如何打包为报文和解码,Modbus 上所有设备的传输模式 (和串行口参数) 必须相同方可实现正常通信。

4.1、RTU 传输模式

当设备使用 RTU (Remote Terminal Unit) 模式在 Modbus 串行链路通信, 报文中每个 8 位字节含有两个 4 位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比 ASCII 模式有更高的吞吐率,每个报文必须以连续的字符流传送。

RTU 模式每个字节 ( 11 位 ) 的格式如下所示:

编码系统: 8–位二进制 报文中每个8位字节含有两个 4 位十六进制字符(0–9, A–F) Bits per Byte:  1 起始位                8 数据位, 首先发送最低有效位                1 位作为奇偶校验                1 停止位
复制代码

为了保证与其它产品的最大兼容性,默认 RTU 校验模式必须为偶校验,每个字符或字节均从左到右顺序发送,由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收 新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。 在 RTU 模式,报文帧由时长至少为 3.5 个字符时间的空闲间隔区分。在后续的部分,这个时间区间被称作 t3.5。RTC 报文帧如下所示:

整个报文帧必须以连续的字符流发送,如果两个字符之间的空闲间隔大于 1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。

4.2、ASCII 传输模式

当 Modbus 串行链路的设备被配置为使用 ASCII (American Standard Code for Information Interchange) 模式通信时, 报文中的每个 8 位子节以两个 ASCII 字符发送,当通信链路或者设备无法符合 RTU 模式的定时管理时使用该模式,只不过由于一个子节需要两个字符,此模式比 RTU 效率低。例 : 数值 0X5B 会被编码为两个字符 : 0x35 和 0x42 ( ASCII 编码 0x35 ="5", 0x42 ="B" )。

ASCII 模式每个字节 ( 10 位 ) 的格式如下所示:

编码系统: 十六进制,ASCII 字符 0-9, A-F 报文中每个 ASCII 字符含有 1 个十六进制字符 Bits per Byte:  1 起始位                7 数据位, 首先发送最低有效位                1 位作为奇偶校验                1 停止位
复制代码

为了保证与其它产品的最大兼容性,默认 ASCII 校验模式必须为偶校验,每个字符或字节均从左到右顺序发送,由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始 接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。报文帧的地址域含有两个字符,在 ASCII 模式, 报文用特殊的字符区分帧起始和帧结束。一个报文必须以一个‘冒号’ ( : ) (ASCII 十六进制 3A )起始,以 ‘回车-换行’ (CR LF) 对 (ASCII 十六进制 0D 和 0A) 结束。对于所有的域,允许传送的字符为十六进制 0–9, A–F (ASCII 编码)。

设备连续的监视总线 上的 ‘冒号’ 字符。 当收到这个字符后,每个设备解码后续的字符一直到帧结束。 报文中字符间的时间间隔可以达一秒。如果有更大的间隔,则接受设备认为发生了错误。ASCII 报文帧如下图所示:


发布于: 2021 年 04 月 14 日阅读数: 15
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

【公众号】美男子玩编程

评论

发布
暂无评论
Modbus协议在串行链路上的实现