演示截图
视频演示
原始设备制造商 (OEM) 都拥有专有的通信协议,例如 Profinet、CIP、DeviceNet 和 ControlNet,用于与工厂车间的所有设备进行通信。众所周知,控制器、仪器和外围设备的制造商不同,这留下了如何使它们相互交换数据的问题。这导致开源协议弥合了专有协议在与第三方设备通信方面留下的差距。标准开放协议有 Modbus、OPC DA、OPC UA、MQTT。本文将深入探讨 MODBUS 协议、其优点、类型和实现。
MODBUS 是 Modicon(现为施耐德电气)于 1979 年开发的用于可编程逻辑控制器的通信协议。数据的 Modbus 传输可以通过串行线路或以太网。许多设备现在都兼容 Modbus,因为它现在是一种被广泛接受的通信协议。监控和数据采集主要使用 Modbus (SCADA) 从远程终端单元 (RTU) 和 PLC 接收数据。
Modbus 可分为三大类:
Modbus RTU
Modbus ASCII
Modbus TCP
Modbus RTU 是最常用的 Modbus 协议。Modbus RTU 是一种简单的串行协议,可以使用标准 UART 技术发送。在从每秒 1200 位(波特)到每秒 115200 位的波特率范围内,数据以 8 位字节的形式传送,一次一位。大多数 Modbus RTU 设备仅支持每秒 38400 位。Modbus RTU 运行主从结构。一个 Modbus 主站最多可以连接 254 个从站并交换数据。每个从机都有自己的 8 位设备地址,通常称为单元号。通信所针对的从站地址包含在主站发送的数据包中。从机必须仅在其地址被识别时才回答,并且必须在特定时间内这样做,否则主机将认为这是“无响应”错误。从站是任何使用 Modbus 分析数据并向主站发送响应消息的外围设备,例如 I/O 传感器、阀门、网络驱动器或其他测量设备。RTU 网络的通信介质是串行的,使用 RS232、RS422 或 RS485。
使用 DB9 电缆物理连接 RS232、RS485、RS422
Modbus ASCII 是旧版本的协议,它包含 RTU 数据包的所有元素,但完全用可理解的 ASCII 字符编写。Modbus ASCII 不受支持,未被广泛使用,也不包含在官方 Modbus 协议规范中。
自诞生以来,以太网 IP/TCP 一直是最常见的网络协议。Modbus TCP 将 Modbus RTU 数据包封装在 TCP 数据包中,可以通过传统以太网网络发送。在 TCP 中,从地址不是主要的寻址方法。IP 地址,例如 192.168.0.20,在这里是最重要的。常规的 Modbus TCP 端口是 502,但如果需要,它会经常重新配置。Modbus TCP 遵循 OSI 网络模型。
Modbus 从传统的主从关系转变为客户端到服务器,其中主机成为客户端,从机成为服务器。可以有多个客户端和多个从站,这是通过以太网 IP 的点对点通信实现的 Modbus TCP 的优点之一。标准 RJ 45 电缆 (LAN) 用于物理连接 Modbus TCP 兼容设备。
为了能够充分利用任何技术,有必要了解它的功能。Modbus 在发送不同类型的数据时使用寄存器。寄存器就像存放数据点的“桶”。Modbus中使用的一些寄存器包括以下内容;
离散输入(触点)Discrete inputs (contacts)::离散输入是位触点寄存器,只能读取。最好将它们描述为 PLC 编程中的触点。
离散输出(线圈)Discrete Outputs (Coils):线圈是用作输出的一位寄存器。它们都是读寄存器和写寄存器。
输入寄存器Input registers:输入寄存器是用于输入的 16 位寄存器。它们是只读的。
保持寄存器Holding registers:保持寄存器是可读写的 16 位寄存器。它们是最通用的寄存器,因为它们可用于输入、输出和保存任何类型的数据。
Modbus 协议规定了可用于访问 Modbus 寄存器的功能代码的数量。Modbus 定义了四个独立的数据块,每个数据块都有重叠的地址或寄存器号。因此,需要地址(或寄存器编号)和功能代码来全面说明在哪里可以找到一条数据(或寄存器类型)。Modbus 可识别的功能码如下表所示。虽然这不是功能代码的详尽列表,但它们是最常用和最重要的功能代码。
当 Modbus 从站检测到数据包但断定请求包含错误时,它会以异常代码而不是数据响应进行响应。从机地址或单元号、高位设置的功能代码副本和异常代码组成异常回复。
这只是对 Modbus 协议的全部内容的介绍。互联网上的大量资源将解释其中一些概念。我鼓励读者探索其中的一些资源。Modbus 协议是一种通用的工业网络协议,在自动化社会中获得了相关性;因此,必须有一个很好的理解。
其它笔记:
①Coil和Register
Modbus中定义的两种数据类型。Coil是位(bit)变量;Register是整型(Word,即16-bit)变量。②Slave和Master与Server和Client
同一种设备在不同领域的不同叫法。Slave:工业自动化用语;响应请求;Master:工业自动化用语;发送请求;Server:IT用语;响应请求;Client:IT用语;发送请求; 在Modbus中,Slave和Server意思相同,Master和Client意思相同。
2.Modbus数据模型Modbus中,数据可以分为两大类,分别为Coil和Register,每一种数据,根据读写方式的不同,又可细分为两种(只读,读写)。Modbus四种数据类型:Discretes Input 位变量 只读Coils 位变量读写Input Registers16-bit整型 只读Holding Registers 16-bit整型 读写 通常,在Slave端中,定义四张表来实现四种数据。
3.Modbus地址范围对应表
设备地址Modbus地址 描述 功能R/W
1~10000 address-1 Coils(Output) 0 R/W
10001~20000 address-10001 Discrete Inputs 01 R
30001~40000 address-30001 Input Registers 04 R
40001~50000 address-40001 Holding Registers 03 R/W
4.Modbus变量地址映射地址 FunctionCode 地址类型 R/W 描述
0xxxx 01,05,15 Coil R/W -
1xxxx 02 离散输入 R -
2xxxx 03,04,06,16 浮点寄存器 R/W 两个连续16-bit寄存器表示一个浮点数(IEEE754)
3xxxx 04 输入寄存器 R 每个寄存器表示一个16-bit无符号整数(0~65535)
4xxxx 03,06,16 保持寄存器 R/W -
5xxxx 03,04,06,16 ASCII字符 R/W 每个寄存器表示两个ASCII字符
Function Code 03是用于读HoldingRegisters,而Function Code 04用于读InputRegisters。两个功能码的区别在于使用在不同的寄存器上。
Input Register用于读取Slave的信息,长度为16-bit,只能读,不能写,地址范围是30001 - 39999。
Holding Register用于读取Slave的信息,或向Slave发送信息,长度为16-bit,可以读,也可以写,地址范围是40001 - 49999。
为什么你只能用03来读数据呢?因为你要读的Slave,把数据放在了Holding Registers里,地址是4xxxx。之所以选择Holding Register,考虑到既要能读,也要能写。
参考:
1】PLC Programming & Automation Tutorials (solisplc.com)
https://www.solisplc.com/tutorials
2】The Modbus Organization
https://modbus.org/
3】An Introduction to the Modbus Communication Protocol (solisplc.com)
https://www.solisplc.com/tutorials/modbus?msclkid=e8457c5bd12411ecb2c27753739652e3
4】What is Modbus? | Types of Modbus | RealPars
https://realpars.com/modbus/?msclkid=e844ffb2d12411ec8344c51b01251359
5】Modbus simulator download | SourceForge.net
https://sourceforge.net/projects/modrssim/
https://sourceforge.net/projects/modrssim2/
6】https://www.zhihu.com/question/53235349/answer/136247068
7】https://zhuanlan.zhihu.com/p/146486090
The End