Modbus 标准定义了 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。它还将串行链路上的协议标准化,以便在一个主站和一个或多个从站之间交换 Modbus 请求。
Modbus 串行链路协议。 Modbus 串行链路协议是一个主/从协议。 该协议位于 OSI 模型的第二层(数据链路层)。一个主从类型的系统有一个向某个“子” 节点发出显式命令并处理响应的节点(主节点)。 典型的子节点在没有收到主节点的请求时并不主动发送数据,也不与其它子节点通信。
在物理层,Modbus 串行链路系统可以使用不同的物理接口(RS485 、RS232) 。最常用的是TIA/EIA-485 (RS485) 两线制接口。作为附加的选项,也可以实现 RS485 四线制接口。当只需要短距离的点到点通信时,TIA/EIA-232-E (RS232) 串行接口也可以使用。
下图给出了 Modbus 串行通信栈对应于 7 层 OSI 模型的一般关系。
位于 OSI 模型第 7 层的 Modbus 应用层报文传输协议, 供了连接于总线或网络的设备之间的客户机/服务器通信。在 Modbus 串行链路上客户机的功能由主节点提供而服务器功能由子节点实现。
二.数据链路层协议
1 Modbus 主站/从站协议原理
Modbus 串行链路协议是一个主-从协议。 在同一时刻,只有一个主节点连接于总线,一个或多个子节点 (最大编号为 247 ) 连接于同一个串行总线。Modbus 通信总是由主节点发起。子节点在没有收到来自主节点的请求时,从不会发送数据。子节点之间从不会互相通信。主节点在同一时刻只会发起一个 Modbus 事务处理。
主节点以两种模式对子节点发出 Modbus 请求:
在单播模式, 主节点以特定地址访问某个子节点,子节点接到并处理完请求后, 子节点向主节点返回一个报文(一个'应答')。在这种模式, 一个 Modbus 事务处理包含 2 个报文: 一个来自主节点的请求, 一个来自子节点的应答。每个子节点必须有唯一的地址 (1 到 247) 这样才能区别于其它节点被独立的寻址。
在广播模式,主节点向所有的子节点发送请求。对于主节点广播的请求没有应答返回。 广播请求一般用于写命令。 所有设备必须接受广播模式的写
功能。地址 0 是专门用于表示广播数据的。
2. Modbus 地址规则
Modbus 寻址空间有 256 个不同地址。
地址 0 保留为广播地址。 所有的子节点必须识别广播地址。
Modbus 主节点没有地址, 只有子节点必须有一个地址。 该地址必须在 Modbus 串行总线上唯一。
3.帧描述
在不同总线或网络的 Modbus 协议映射在协议据单元之外引入了一些附加的域。 发起 Modbus 事务处理的客户端构造 Modbu PDU,然后添加附加的域以构造适当的通信 PDU。
在 Modbus 串行链路,地址域只含有子节点地址,如前文所述, 合法的子节点地址为十进制 0 –247。 每个子设备被赋予 1 – 247 范围中的地址。主节点通过将子节点的地址放到报文的地址域对子节点寻址。 当子节点返回应答时。它将自己的地址放到应答报文的地址域以让主节点知道哪个子节点在回答。功能码指明服务器要执行的动作。功能码后面可跟有表示含有请求和响应参数的数据域。错误检验域是对报文内容执行 "冗余校验" 的计算结果。根据不同的传输模式 (RTU or ASCII)使用两种不同的计算方法。
4.主从状态图
Modbus 由两个不同的子层组成 :主/ 从协议 传输模式 ( RTU 和 ASCII 模式)
对上面的状态图的一些解释 :
状态"空闲" = 无等待的请求。 这是电源上电后的初始状态。 只有在"空闲"状态请求才能被发送。发送一个请求后,主节点离开"空闲"状态, 而且不能同时发送第二个请求。
当单播请求发送到一个子节点,主节点将进入"等待应答" 状态, 同时一个临界超时定时启动。这个超时称为 "响应超时"。 它避免主节点永远处于"等待应答" 状态。 响应超时的时间依赖于具体应用。
当收到一个应答时,主节点在处理数据之前检验应答。在某些情况下,检验的结果可能为错误。如收到来自非期望的子节点的应答, 或接收的的帧错误。在收到来自非期望子节点的应答时, 响应超时继续计时;当检测到帧错时,可以执行一个重试。
响应超时但没有收到应答时, 则产生一个错误。 那么主节点进入”空闲” 状态, 并发出一个重试请求。重试的最大次数取决于主节点 的设置。
当广播请求发送到串行总线上,没有响应从子节点返回。然而主节点需要进行延迟以便使子节点在发送新的请求处理完当前请求。该延迟被称作"转换延迟"。因此,主节点会在返回能够发送另一个请求的“空闲”状态之前,到" 等待转换延迟"状态。
在单播方式,响应超时必须设置到足够的长度以使任何子节点都能处理完请求并返回响应。而广播转换延迟必须有足够的长度以使任何子节点都能只处理完请求而可以接收新的请求。 因此,转换延迟应该比响应超时要短。典型的响应超时在 9600 bps 时从 1 秒到几秒,而转换延迟从 100 ms 到 200ms。
帧错误包括 : 1) 对每个字符的奇偶校验; 2) 对整个帧的冗余校验。
对上面的状态图的一些解释:
状态 “空闲”= 没有等待的请求。 这是电源上电后的初始状态。
当收到一个请求时, 子节点在处理请求中要求的动作前检验报文包。 不同的错误可以发生于: 请求的格式错,非法动作,…… 当检测到错误时,必须向主节点发送应答。
当要求的动作完成后,单播报文要求必须格式化一个应答并发往主节点。
如果子节点在接收到的帧中检测到错误, 则没有响应返回到主节点。
任何子节点均应该定义并管理 Modbus 诊断计数器以供诊断信息。通过使用 Modbus 诊断功能码,可以得到这些计数值。
5. 两种串行传输模式
有两种串行传输模式被定义: RTU 模式 和 ASCII 模式。它定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和解码。Modbus 串行链路上所有设备的传输模式(和串行口参数) 必须相同。尽管在特定的领域 ASCII 模式是要求的,但达到 Modbus 设备之间的互操作性只有每个设备都有相同的模式: 所有设备必须必须实现 RTU 模式。 ASCII 传输模式是选项。设备应该由用户设成期望的模式, RTU 或 ASCII。 默认设置必须为 RTU 模式。
1)RTU 传输模式
当设备使用 RTU (Remote T erminal Unit) 模式在 Modbus 串行链路通信, 报文中每个 8 位字节含有两个 4 位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比 ASCII 模式有更高的吞吐率。每个报文必须以连续的字符流传送。
RTU 模式每个字节 ( 11 位) 的格式为:
编码系统: 8–位二进制
报文中每个 8 位字节含有两个 4 位十六进制字符(0–9,A–F)
Bits perByte: 1 起始位
8 数据位, 首先发送最低有效位
1 位作为奇偶校验
1 停止位
偶校验是要求的, 其它模式 ( 奇校验, 无校验 ) 也可以使用。 为了保证与其它产品的最大兼容性,同时支持无校验模式是建议的。默认校验模式模式 必须为偶校验。
注 : 使用无校验要求 2 个停止位。
帧描述:
Modbus RTU 帧最大为 256 字节。
由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。在 RTU 模式,报文帧由时长至少为 3.5 个字符时间的空闲间隔区分。在后续的部分,这个时间区间被称作 t3.5。
整个报文帧必须以连续的字符流发送。如果两个字符之间的空闲间隔大于 1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。
R TU 接收驱动程序的实现,由于 t1.5 和t3.5 的定时,隐含着大量的对中断的管理。在高通信速率下,这导致 CPU 负担加重。因此,在通信速率等于或低于 19200 Bps 时,这两个定时必须严格遵;对于波特率大于 19200 Bps 的情形,应使用 2 个定时的固定值:建议的字符间超时时间(t1.5)为 750?s,帧间的超时时间 (t1.5) 为 1.750ms。
从"初始" 态到 “空闲” 态转换需要 t3.5 定时超时: 这保证帧间延迟
“空闲” 态是没有发送和接收报文要处理的正常状态。
在 R TU 模式, 当没有活动的传输的时间间隔达 3.5 个字符长时,通信链路被认为在 “空闲”态。
当链路空闲时, 在链路上检测到的任何传输的字符被识别为帧起始。 链路变为"活动" 状态。然后, 当链路上没有字符传输的时间间个达到 t3.5 后,被识别为帧结束。
检测到帧结束后,完成 CRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。 为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧结束。这样,CRC 计算只需要在帧寻址到该节点 (包括广播帧) 时进行。
2)ASCII 传输模式
发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。
报文帧的地址域含有两个字符。在 ASCII 模式, 报文用特殊的字符区分帧起始和帧结束。一个报文必须以一个‘冒号’ ( :)(ASCII 十六进制 3A)起始,以 ‘回车-换行’(CR LF) 对 (ASCII 十六进制 0D 和 0A) 结束。
报文中字符间的时间间隔可以达一秒。如果有更大的间隔,则接受设备认为发生了错误。
每个字符子节需要用两个字符编码。因此,为了确保 ASCII 模式 和 RTU 模式在 Modbus 应用级兼容,ASCII 数据域最大数据长度为 (2x252) 是 RTU 数据域 (252) 的两倍。必然的, Modbus ASCII 帧的最大尺寸为 513 个字符。