参考资料
- 工业控制网络
1. Modbus 概述
-
Modbus 是全球第一个真正用于工业现场的总线协议。为更好地普及和推动 Modbus 在基于以太网上的分布式应用,目前施耐德公司已将 Modbus 协议的所有权移交给 IDA (Interfacefor DistributedAutomation,分布式自动化接口) 组织并成立了 Modbus-IDA 组织。在中国,Modbus 已经成为国家标准 GB/T19582-2008
-
Modbus 协议描述了控制器请求访问其他设备的过程、如何回应来自其他设备的请求以及怎样侦测错误并记录
-
Modbus 协议是一种应用层协议,它定义了一种通用的消息格式,使得不同的设备之间可以进行数据交换和控制。该协议支持不同的物理层,如 RS-232、RS-422、RS-485 和以太网,因此可以应用于不同的设备和网络
1.1 Modbus 的特点
- 标准、开放。用户可以免费、放心地使用 Modbus 协议,不需要交纳许可费用,也不会侵犯知识产权。目前,支持 Modbus 的厂家超过 400 家,支持 Modbus 的产品超过 600 种
- Modbus 可以支持多种电气接口,如 RS-232、RS-485 和以太网等,还可以在各种介质上传送,如双绞线、光纤和无线介质等
- Modbus 的格式简单、紧凑,通俗易懂,用户使用容易,厂商开发简单
1.2 Modbus 的通信模型
- Modbus 是 OS I参考模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信,Modbus 的通信模型如下图所示
- Modbus 包括标准 Modbus、Modbus TCP 和 Modbus + 3 种形式
- 标准 Modbus 指的就是在异步串行通信中传输 Modbus 信息
- Modbus + 指的就是在一种高速令牌传递网络中传输 Modbus 信息,采用全频通信,具有更快的通信传输速率
- Modbus TCP 就是采用 TCP/IP 和以太网协议来传输 Modbus 信息,属于工业控制网络范畴
1.3 通用 Modbus 帧
- Modbus 协议定义了一个与基础通信层无关的简单协议数据单元 (PDA),特定总线或网络上的 Modbus 协议映射能够在应用数据单元 (ADU) 上引入一些附加字段,通用 Modbus 帧格式如下图所示
- Modbus PDU 中功能码的主要作用是告知将执行哪种操作,功能码后面是含有请求和响应参数的数据域
- Modbus ADU 中的附加地址用于告知站地址,差错校验码是根据报文内容执行冗余校验计算的结果
1.4 Modbus 通信原理
- Modbus 是一种简单的客户机/服务器型应用协议,其通信过程如下图所示
- 首先,客户机准备请求并向服务器发送请求,即发送功能码和数据请求,此过程称为启动请求
- 服务器分析并处理客户机的请求,此过程称为执行操作,最后向客户机发送处理结果,即返回功能码和数据响应,此过程称为启动响应
- 如果在执行操作过程中出现任何差错,服务器将启动差错响应,即返回一个差错码/异常码
- Modbus 串行链路协议是一个主-从协议,串行总线的主站作为客户机,从站作为服务器
- 在同一时刻只有一个主站连接总线,一个或多个 (最多为 247 个) 从站连接于同一个串行总线
- Modbus 通信总是由主站发起,从站根据主站功能码进行响应
- 从站在没有收到来自主站的请求时,不会发送数据,所以从站之间不能互相通信
- 主站在同一时刻只会发起一个 Modbus 事务处理
- 主站以如下两种模式对从站发出 Modbus 请求
- 单播模式
- 在单播模式下,主站寻址单个从站,从站接收并处理完请求后,向主站返回一个响应
- 在这种模式下,一个 Modbus 事务处理包含 2 个报文,一个是来自主站的请求,另一个是来自从站的应答
- 每个从站必须有唯一的地址 (1~247),这样才能区别于其他节点而被独立寻址
- 广播模式
- 在广播模式下,主站向所有从站发送请求,对于主站广播的请求没有应答返回
- 广播请求必须是写命令
- 所有的设备必须接受广播模式的写功能,地址 0 被保留用来识别广播通信
- 单播模式
2. Modbus 物理层
- 在物理层,串行链路上的 Modbus 系统可以使用不同的物理接口,最常用的是 RS-485 两线制接口
- 作为附加选项,该物理接口也可以使用 RS-485 四线制接口
- 当只需要短距离的点对点通信时,也可以使用 RS-232 串行接口作为 Modbus 系统的物理接口
2.1 RS-232 接口标准
- RS-232C 是美国电子工业协会 EIA(Electronic Industry Association) 制定的一种串行物理接口标准
- RS 是英文 “推荐标准” 的缩写,232 为标识号,C 表示修改次数
- RS-232 总线标准设有 25 条信号线,包括一个主通道和一个辅助通道,其主要端子分配如下图所示
2.1.1 信号含义
-
RS-232 的功能特性定义了 25 芯标准连接器中的 20 根信号线,其中 2 条地线、4 条数据线、11 条控制线、3 条定时信号线,剩下的 5 根线作备用或未定义。常用的只有如下所述的 9 根
-
1. 联络控制信号线(6 根)
- 数据发送准备好 (DSR):DSR 有效时,表明 MODEM(调制解调器) 处于可使用的状态
- 数据终端准备好 (DTR):DTR 有效时,表明数据终端可以使用
- 这两个设备状态信号有效,只表示设备本身可用,能否进行通信要由下面的控制信号决定
- 请求发送(RTS):表示 DTE 请求 DCE 发送数据,即当终端准备要接收 MODEM 传来的数据时,使该信号有效,请求 MODEM 发送数据,它用来控制 MODEM 是否要进入发送状态
- 允许发送(CTS):表示 DCE 准备好接收 DTE 发来的数据,当 MODEM 准备好接收终端传来的数据,并向前发送时,使该信号有效,通知终端开始沿发送数据线 TXD 发送数据
- 振铃指示(RI):当 MODEM 收到交换台送来的振铃呼叫信号时使RI信号有效(ON状态),通知终端已被呼叫。
-
2. 数据发送与接收线(2 根)
- 发送数据(TXD):通过 TXD 终端将串行数据发送到 MODEM(DTE-DCE)
- 接收数据(RXD):通过RXD线终端接收从 MODEM 发来的串行数据 (DCE-DTE)
-
3. 地线(1 根)
- GND 提供参考电位,无方向
通常只需 TXD、RXD 和 GND 三根线即可实现通信
2.1.2 电气特性
- 在 TXD 和 RXD 上(数据,信息码)
- 逻辑 1(MARK,传号) =-3~-15V
- 逻辑 0(SPACE,空号) =+3~+15V
- 在 RTS、CTS、DSR、DTR 和 DCD 等上(控制信号)
- 信号有效(接通,ON 状态,正电压) =+3~+15V
- 信号无效(断开,OFF 状态,负电压) =-3~-15V
因此,实际工作时,应保证电平在 ±(3~15) V
2.1.3 RS-232 电平转换
- 为实现采用 +5V 供电的 TTL 和 CMOS(Component Object Mode) 通信接口电路能与 RS-232 标准接口连接,必须进行串行口的输入/输出信号的电平转换
2.2 RS-485 接口标准
- RS-232 接口可以实现点对点的通信方式,但这种方式不能实现联网功能,RS-485 接口解决了这个问题
2.2.1 RS-485 接口特点
- 逻辑 1 以两线间的电压差为 +(0.2~6)V 表示,逻辑 0 以两线间的电压差为 -(0.2~6)V 表示。接口信号电平比 RS-232 低,不易损坏接口电路的芯片,且该电平与 TTL 电平兼容,方便与 TTL 电路连接
- RS-485 接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好
- RS-48 5最大的通信距离约为 1219m,最大传输速率为 10Mbit/s,传输速率与传输距离成反比,在 100kbit/s 的传输速率下,才可以达到最大的通信距离,如需传输更长的距离,需要加 485 中继器
- RS-485 总线一般最大支持 32 个节点,如果使用特制的 485 芯片,可以达到 128 个或者 256 个节点,最多可以支持到 400 个节点
- RS-485 与 RS-232 之间的主要性能指标的比较如下图
2.2.2 RS-485 的优点
- 成本低
- 网络驱动能力强
- 连接距离远
- 传输速率快
3. Modbus 串行链路层标准
- Modbus 串行链路层标准就是通常所说的标准 Modbus 协议,它是 Modbus 协议在申行链路上的实现
- Modbus串行链路层协议是一个主从协议,该协议位于 OSI 参考模型的第 2 层
- Modbus 串行链路层标准定义了一个控制器能够识别使用的消息结构,而不管它们是经过何种网络进行通信的,也不需要考虑通信网络的拓扑结构
- 它定义了各种数据帧格式,用以:描述控制器请求访问其他设备的过程、如何响应来自其他设备的请求以及怎样侦测错误并记录
3.1 Modbus 传输模式
- Modbus 定义了 ASCII (美国信息交换标准代码) 和 RTU (远程终端单元) 两种串行传输模式
- 在 Modbus 串行链路上,所有设备的传输模式 (及串行口参数) 必须相同,默认设置为 RTU 模式,所有设备必须实现 RTU 模式
- 若要使用 ASCII 模式,需要按照使用指南进行设置
3.1.1 ASCII 模式
- ASCII 模式的消息以冒号(:)字符 (ASCII 码 3AH) 开始,以回车换行符结束 (ASCII 码 0DH,0AH)
- 其他域可以使用的传输字符是十六进制的 0···9,A···F 的 ASCII 码。网络上的设备不断侦测冒号 “:” 字符,当接收到一个冒号时,每个设备都解码下个域 (地址域) 来判断是否发给自己的
- 消息中字符间发送的时间间隔最长不能超过 1s,否则接收的设备将认为传输错误。典型 ASCII 消息帧结构如下图
- 例如向 1 号从站的 2000H 寄存器写入 12H 数据的 ASCII 消息格式,如下表
- 完整的 ASCII 消息为 3AH 30H 31H 30H 36H 32H 30H 30H 30H 30H 30H 31H 32H 43H 37H 0DH 0AH
3.1.2 RTU 模式
- RTU 模式的消息发送至少要以 3.5 个字符时间的停顿间隔开始
- 传输的第一个域是设备地址,可以使用的传输字符是十六进制的 0···9,A···F
- 网络设备不断侦测网络总线,包括停顿间隔时间内,当第一个域 (地址域) 接收到时,每个设备都进行解码以判断是否发往自己的
- 在最后一个传输字符之后,一个至少 3.5 个字符时间的停顿标定了消息的结束,一个新的消息可在此停顿后开始
- 整个消息帧必须作为一连续的流转输
- 如果在帧完成之前有超过 1.5 个字符时间的停顿时间,接收设备将刷新不完整的消息,并假定下一字节是一个新消息的地址域
- 同样地,如果一个新消息在小于 3.5 个字符时间内接着前个消息的开始,接收设备将认为它是前一消息的延续,这将导致一个错误,因为在最后 CRC 域的值不可能是正确的
- 典型的 RTU 消息帧结构如下图
- 例如向 1 号从站的 2000H 寄存器写入 12H 数据的 RTU 消息格式,如下表
- 完整的 RTU 消息为 01H 06H 20H 00H 00H 12H 02H 01H
3.1.3 地址域
- 消息帧的地址域包含两个字符 (ASCII) 或 8bit(RTU),可能的从站地址是 0~247 (十进制)
- 单个设备的地址范围是 1~247
- 主站通过将要联络的从站的地址放入消息中的地址域来选通从站,当从站发送回应消息时,它把自己的地址放入回应的地址域中,以便主站知道是哪一个设备作出回应
- 地址 0 是用做广播的地址,所有的从站都能认识
- 当 Modbus 协议用于更高水准的网络时,广播可能不允许或以其他方式代替
3.1.4 功能代码域
- 消息帧的功能代码域包含两个字符 (ASCII) 或 8bit(RTU),可能的代码范围是进制的 1~255
- 当消息从主站发往从站时,功能代码域将告知从站需要执行哪些行为,例如,去读取输入的开关状态、读一组寄存器的数据内容、读从站的诊断状态以及允许调入、记录、校验在从站中的程序等
- 当从站回应时,它使用功能代码域来指示是正常响应(无误)还是有某种错误发生(错误回应)
- 对于正常响应,从站仅回应相应的功能代码
- 对于差错响应,从站返回一差错码其格式为功能代码的最高位置 1
3.1.5 数据域
- 数据域是由两个十六进制数集合构成的,范围为 00~FFH
- 根据网络传输模式,这可以是由一对 ASCII 字符组成或一个 RTU 字符组成的
- 从主站发给从站的消息的数据域包含附加的信息,指示从站必须用于进行执行由功能代码所定义的行为
- 如果主站需要从站读取一组保持寄存器 (功能代码 03H),数据域指定了起始寄存器以及要读的寄存器数量
- 如果主站写一组从站的寄存器 (功能代码 10H),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数要写入寄存器的数据
- 如果没有错误发生,由从站返回的数据域包含请求的数据,如果有错误发生,此域包含异常码,主站应用程序可以用来判断采取下一步行动
- 在某种消息中,数据域可以是不存在的 (0 长度)
- 例如,主站要求从站回应通信事件记录(功能代码 0BH)时,从站不需任何附加的信息
3.2 Modbus 差错检验
- 标准的 Modbus 串行链路的可靠性基于两种错误检验方法,即奇偶校验和帧校验
- 奇偶校验 (偶或奇) 应该被每个字符采用
- 帧校验 (LRC 或 CRC) 必须运用于整个报文
3.2.1 奇偶校验
- 用户可以配置控制器是奇或偶校验,或无校验,这将决定每个字符中的奇偶校验位是如何设置的
- 如果指定了奇或偶校验,1 的位数将算到每个字符的位数中 (ASCII 模式 7 个数据位,RTU 模式 8 个数据位)
- 例如,RTU 字符中包含 8 个数据位 (11000101),其中 1 的数目是 4 个
- 如果使用了偶校验,帧的奇偶校验位将是 0,RTU 字符中 1 的个数仍是 4 个
- 如果使用了奇校验,帧的奇偶校验位将是 1,使得 1 的个数是 5 个
- 例如,RTU 字符中包含 8 个数据位 (11000101),其中 1 的数目是 4 个
- 如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测,一个附加的停止位填充至要传输的字符帧中
3.2.2 帧校验
-
LRC 检验
- 采用 ASCII 传输模式时,ASCII 消息帧中包括了一个基于 LRC 方法的错误检测域
- LRC 域检测消息帧中除开始的冒号及结束的回车换行号外的内容
- LRC 域是一个包含 8 位二进制值的字节。LRC 值由传输设备来计算并放到 ASCII 消息帧中,接收设备在接收 ASCII 消息的过程中计算 LRC,并将它和接收到的 ASCII 消息帧 LRC 域中的值比较,如果两值不等,则说明有错误
- LRC 方法是将消息中 8bit 的字节连续累加,丢弃了进位
-
CRC 检验
- 采用 RTU 模式时,RTU 消息帧包括了一个基于 CRC 方法的错误检测域
- CRC 域检测整个 RTU 消息帧的内容
- CRC 域是两个字节,包含 16 位二进制值。它由传输设备计算后加入 RTU 消息中,接收设备重新计算收到的 RTU 消息帧的 CRC,并与接收到的 CRC 域中的值比较,如果两值不同,则有误
- CRC 值的计算方法是先调入一个值是全 1 的 16 位寄存器,然后调用计算过程将消息中连续的 8 位字节和当前寄存器中的值进行处理。仅每个字符中的 8bit 数据对 CRC 有效,起始位和停止位以及奇偶校验位均无效
- CRC 添加到消息中时,低字节先加入,然后加入高字节
3.3 Modbus 功能码
- Modbus 协议定义了公共功能码、用户定义功能码和保留功能码 3 种功能码
- 公共功能码是指被确切定义的、唯一的功能码,由 Modbus-IDA 组织确认,可进行一致性测试,且已归档为公开
- 用户定义功能码是指用户无需 Modbus-IDA 组织的任何批准就可以选择和实现的功能码,但是不能保证用户定义功能码的使用是唯一的
- 保留功能码是某些公司在传统产品上现行使用的功能码,不作为公共使用
- Modbus 的功能码定义如下表所示
- Modbus 协议常用的功能码主要是 01、02、03、04、05、06、15 和16,对应数据类型如下表
4. Modbus 协议的应用
Modbus 协议在工业控制和监测应用中广泛使用,包括自动化工厂、机器人控制、电力监测和控制、油气开采和运输、水处理和供应、自动化建筑等等。Modbus 也适用于实时数据采集和处理,包括数据传输、数据监测和控制、故障检测和诊断等
-
PLC 控制
- Modbus 协议是许多 PLC(可编程逻辑控制器)之间通信的标准协议
- PLC 是工业自动化领域中广泛应用的设备,它们通常用于控制和监测生产过程中的各种参数,如温度、压力、流量等
-
智能仪表
- Modbus 协议也被广泛用于不同类型的智能仪表之间的通信,如温度传感器、压力传感器、流量计等
- 这些仪表通常用于监测和控制生产过程中的各种参数,以确保生产的稳定性和质量
-
数据采集系统
- Modbus 协议可以用于不同类型的数据采集系统之间的通信,以便将来自不同设备的数据收集到一个集中的位置进行处理和分析
- 这些数据采集系统通常用于监测生产设备的性能和状态,以便及时发现和解决问题
-
SCADA 系统
- Modbus 协议也可以用于不同类型的 SCADA(监视、控制和数据采集)系统之间的通信,以便实现实时监测和控制生产过程中的各种参数
- 这些系统通常用于自动化生产过程,以提高生产效率和质量。