Modbus 是在工业自动化、智能家居、小型自动化网络(仓库、温室等)系统中经常用到的通信协议。该协议也可以将不同类型的设备连接到家用电脑。像 Arduino 和 Raspberry Pi 这类项目的开发显著提高了机器人和自动化相关工作的益处。这些都增强了 Modbus 在业余爱好者和专业人士心目中的特殊地位。
本文将介绍现有的 Modbus 协议设备和网络测试及调试软硬件的主要功能。
如果您对协议架构比较熟悉,可以直接转到 Modbus 软件描述。如果您对协议架构不熟悉,可以参看下面 Modbus 的简要介绍
目录:
Modbus 是自动化系统中低层的常用协议。中层是指控制器-设备层。 该层级收集数据,并控制技术过程。 现场层负责传感器与控制器或者传感器与服务器之间的交互。
典型的自动化系统架构采用 Modbus 作为基础协议,如下所示。
Modbus 协议标准「环境」是 RS485/422/232。 Modbus RTU 或者 Modbus ASCII 在其上方工作。 但是,在 TCP/IP 网络中,高层协议是 TCP 传输协议。 该协议变种被称为 Modbus TCP。 本文将介绍 Modbus RTU 传输模式。
Modbus 协议中采用了主-从关系。 这意味着通信总是由主设备发起。 主设备向从设备发起请求,并等待响应。 在网络中只有一台主设备和最多 247 台从设备。
主设备采用请求-响应格式与从设备进行交互。 该请求包含一系列字节,我们称之为帧。 字节间的时间由数据传输率决定。 每个时间间隔只能传输 1.5 个字节。在 RTU mode 下,消息传输以不少于 3.5 字符的静默间隔开始。
请求消息发送格式如下:
ID - 设备地址 (1 字节),
FN - Modbus 功能 (1 字节),
[args] - 功能自变量 (N 字节, 由函数决定),
CRC - 检验和 CRC-16 (2 字节)。
响应消息格式:
大家可以看出来,响应和请求帧有类似的结构,除了 Data 区域外。该区域根据不同功能,提供不同的内容。
如果从设备不支持请求的功能,或者请求的 [args] 区域内自变量不适用该服务器,响应的 FN 区域高位将被设定为 1,而 Data 区域则会包含有关错误的更多信息。
同时,一些从设备可能采用特殊寄存器,提供更多信息。
Modbus 设备寄存器有以下类型:
区域 | 访问 | 大小 | 描述 |
---|---|---|---|
离散输入 | 只读 | 1 位 | 用作输入 |
线圈输出 | 读/写 | 1 位 | 用作控制离散 |
输入寄存器 | 只读 | 16 位 | 用作输入 |
保持寄存器 | 读/写 | 16 位 | 用作任意变量 |
Modbus RTU 协议的完整说明可以参考其规格说明。
当设置好 Modbus 网络后,需要注意的一点是,该协议实现了从安装了 Modbus 驱动的服务器或控制器与多台接收设备之间的数据传输。 串口程序可以控制服务器的通信端口(例如,COM1)。 该端口接收来自多个传感器的 Modbus 数据。
不幸的是,在这里存在限制,那就是多个程序同时打开接收端口时,会带来明显的问题。
有一个方案可以解决这一难题。Electronic Team 出品的 Virtual COM Port Driver 可以创建虚拟 RS485 端口,并复制 Modbus 数据。 这样多个端口可以同时接收数据。
用户可以将实际端口的入站数据流复制到多个虚拟端口。 通过将多个程序连接到 COM1 端口的虚拟副本端口上,实现多个程序共享实际端口的效果。
在开发和调试 Modbus RTU 设备时,专家会使用专门的软件和硬件工具。 就硬件设备来说,最简单的方案就是 RS485/USB 转换器。 在所有这类设备中,最高效的恐怕是 MOXA UPORT 1130/UPORT 1150。 该设备使用方便,组装非常容易。当然也有非常复杂的解决方案使用 Ethernet/RS-485 (例如,NPORT 由 MOXA 出品)。
事实上,在 Modbus RTU 设备的开发中,从设备功能是最经常用到的。 从设备含有各种传感器、控制继电器、输入/输出模块等。 主设备通常比较简单。在自动化网络中,主设备功能通常由含 Modbus 协议栈的控制器或者带 Modbus 驱动的 OPC Server/SCADA 系统来执行。
本文不过多介绍 Modbus 协议栈的开发。唯一值得一提的是 FreeMODBUS 库。在此基础上,可以非常容易地构建支持 Modbus 从属功能的设备。
对 Modbus 设备开发的各个层面都可以进行测试。 各种 Modbus 测试软件和硬件针对不同开发阶段和测试目的,因此,存在些许差异。
在开发过程中,可能会遇到这样的情况:设备收到请求并响应(可以由数据接收/传输指示 LED 灯提示,或者调试软件或终端点设置检测),但是数据并不显示在终端或者其它特定程序中。 在这种情况下,用户需要专门的串口嗅探器。
Serial Port Tester 是当前一款最佳 Modbus 监听软件。 该 Modbus 软件可以轻松读取和记录经过系统 COM 端口的串口数据。 软件有一些高级功能,可以实时抓取数据,帮助开发者发现问题解决问题。
COM Port Tester 可以在终端模式下运行,即模拟从监听 COM 端口向插入的设备传输数据。 该功能特别适合 Modbus 通信测试,因为使用该功能可以观察特定设备对于特定命令和数据的反应。
这款软件使用十分方便,不仅可以检测设备是否工作(即,是否正确响应请求),而且还可以测量故平均故障事件。
Modbus 测试软件还可以记录进站和出站数据流。此外,还可以将收集的数据以不同的视图展示(表格、行、转储、终端),以便更好地对比和分析。
调试 Modbus 协议系统和设备的专家要比开发这些系统和设备的专家要多得多。 因此,根据工作任务的特性,不同 Modbus 软件会有些微差别。
要连接控制器和单一从设备,需要使用 RS-485/USB 转换器、电脑和专门软件或终端建立串口通信。 这种情况不需要进行长时间测试,以及大量的日志文件分析。 因此,从设备开发测试阶段使用的运行逻辑和工具集即可满足需求。
对于已有设备网络,以下工作可能需要进行:
要完成上述工作,用户要么使用可以创建请求列表的终端,要么使用专门的工具(如 Modbus Poll, 一款 Modbus 主机模拟器,可以同时监听多个 Modbus 从机或数据区。
一些 Modbus 设备有独特的RS-485接口设置(数据位数、奇偶性、停止位)。 不同设置的设备不能够在同一网络受同一主机控制。 测试和配置这类设备最方便的工具是支持预设端口参数切换,或者可以多线并行运行的终端程序。
另一个难点是与非 Modbus RTU 标准协议设备进行通信。例如,从机的协议在逻辑上可能与 Modbus 类似(数据包结构、超时设定等),但是有些功能是非标准的。
在这种情况下,最好是使用支持定制任意请求的工具 Modbus Poll, ,或者支持类似功能的终端。
标准 SCADA系 统在配合这类设备时效率不高,同时与基于特殊 OPC 服务器的设备通信效率也不高。