Modbus协议在串行链路上的实现
目录
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 报文帧如下图所示:
文章来源: blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/m0_38106923/article/details/105325396
- 点赞
- 收藏
- 关注作者
评论(0)