概述
MODBUS,一种为工业系统现场总线通信奠定基础的工业协议。
1979年,莫迪康推出了一种应用层协议(OSI 模型的第 7 层),用于他们的可编程逻辑控制器 (PLC)。该协议称为MODBUS,成为自动化历史上第一个广泛使用的现场总线。
现场总线是工业网络中用于将现场设备连接到工业控制器的通信协议。现场总线通常可以减少控制器和设备之间所需的接线量,因为多个设备可以连接到同一对线缆之上。
有许多流行的现场总线技术,包括 MODBUS、Profibus、Foundation Fieldbus、ControlNet、DeviceNet 等等。
1. 历史渊源
MODBUS旨在将现场设备连接到工业控制器。在其发明之时,大多数设备使用电压或电流表示作为传达设备状态的手段,也就是离散控制(数字量)使用高位或低位,模拟控制使用 0-10V 或 4-20mA。
现场总线技术的长足发展使得 MODBUS成为最简单的协议之一,并且多年来不断添加新版本。
最初,MODBUS是通过串行通信链路(即RS-232/RS-485)实现的。最终,该协议被改编为通过TCP/IP和以太网使用。这通常被称为 MODBUS-TCP。MODBUS还有其他版本,其中包括使用HDLC协议的MODBUS+。
2. 交互方式
MODBUS使用主/从模型进行通信(Modbus TCP 中的客户端/服务器)。MODBUS主站向 MODBUS从站发送请求,从站执行操作并响应主站。在这种情况下,主站通常是PLC,现场设备充当从站。
MODBUS中的消息帧由应用程序数据单元 (ADU) 和协议数据单元 (PDU) 组成。ADU会根据所用MODBUS的类型而有所不同,而PDU与通信方法无关。
PDU通常由功能码和数据组成。数据通过地址和错误码封装在ADU中。MODBUS-TCP 在ADU中使用MBAP报头。
为了使PDU独立于底层通信层,它必须符合原始串行规范(RTU/ASCII)的大小限制。对于RS485上的ADU,此大小为 256 字节。因此,PDU限制为(256 – 1)个字节和 2 个错误检查字节,总共253个字节。PDU的数据部分包含功能码字段以及正在传输的实际数据。
请注意:ADU中的地址实际上是MODBUS网络上从设备的ID。
3. 数据表示
经典MODBUS有两种传输模式:ASCII和RTU。
在ASCII模式下,数据以ASCII 字符0~9和A~F发送,而在 RTU 模式下,数据以 8 位二进制表示。数据和地址遵循大端字节序,因此最高有效字节首先传输。
MODBUS数据主要有四种类型(区块Block):
-
离散输入
-
线圈(输出)
-
输入寄存器
-
保持寄存器
离散输入代表单个数据位,并且是只读的。线圈也代表单个数据位,但可以读取和写入。输入寄存器代表 16 位只读数据,而保持寄存器代表 16 位读写数据。
对于每种类型,设备内存中最多可以存储 2^16 (65536) 个数据项。分别有特定的功能码用于访问每种不同的数据类型,每种类型通常都有自己专用的内存块。
如需寻址数据项,主机使用的地址范围包括0~65535 。第一项数据的地址一般从0X0000开始。第二项数据的地址则为0X0001。依此类推,第65536项数据的地址应为0XFFFF。
请注意:设备无需拥有所有 65536 个数据,这只是最大值。
4. 协议事务
了解了MODBUS的数据表示方式后,就可以详细了解协议事务。事务主要承载于PDU,因为PDU独立于通信层。
MODBUS规范定义了三种类型的 PDU:
-
MODBUS请求
-
MODBUS响应
-
MODBUS异常响应(极其容易被忽略)
主机设备使用功能码发起请求,而从机设备则发送响应以响应该请求。成功响应将回复主机设备发送给它的功能码。异常响应使用相同的功能代码进行回复,但msb(最高有效位)设置为高(+0X80)以指示出现问题。
MODBUS规范定义了很多功能码。
上图是一个读取线圈请求和响应的示例。
MODBUS主站发送一个功能代码为 0x01(读取线圈)的请求,从第一个数据项(地址 0x0000)开始,只读取一个线圈。读取线圈功能可一次读取最多2000个(0x7D0)线圈。
如果成功,从机设备将使用相同的功能代码和其所回复的线圈数进行响应。线圈状态将为n个字节宽,每个位表示该特定线圈是开启 (1) 还是关闭 (0)。
如果请求未成功,异常响应回复功能码则为0X81,并携带解释错误原因的错误码。如果错误码为0x02表示使用了非法数据地址,即此从站的内存中没有位于 0x0000处的线圈。
上图是一个写入单个寄存器事务 (功能代码0x06) 的示例。
其中,主机设备请求将数据0xA0A0写入地址0x00FF。如从机执行成功,则回复与主机请求相同的报文。
如果请求未成功,异常响应回复功能码则为0X86,并携带解释错误原因的错误码。如异常代码为0x04,则表示从机设备尝试执行请求时发生了不可恢复的错误。
其它的MODBUS功能码也都遵循与上面两个示例类似的模式。
结言
MODBUS是当今业界事实上的标准,也是迄今为止最广泛使用的免版税工业协议。它遍布世界各地的工厂,尽管历史悠久,但在未来仍将是一项重要的工业协议。