使用SerialTool的Modbus RTU、ASCII和TCP

什么是Modbus

Modbus是一种串行通信协议,于1979年由Modicon®(现为Schneider Electric的一部分)创建,用于连接其可编程逻辑控制器(PLC)。它已经成为工业通信的事实标准,并且是全球工业电子设备中最广泛使用的连接协议之一。Modbus是一个免费的协议,其规范在Modbus组织的网站上声明。

简而言之,它是一种在电子设备之间通过串行线传输信息的方法。请求信息的设备称为Modbus客户端,提供信息的设备称为Modbus服务器。在标准的Modbus网络中,有一个客户端和最多247个服务器,每个服务器都有一个从1到247的唯一服务器地址。客户端还可以将信息写入服务器。


最初设计用于工业用途,随着时间的推移,这种协议已经在各个行业中得到采用,成为最广泛使用的协议之一。即使在今天,40多年过去了,它仍然存在于许多设备中,如操作面板、PLC、家庭自动化,甚至集成到诸如Arduino等简单设备中。

通过串口传输的Modbus RTU和ASCII

当协议被创建时,通信预计是通过串口进行的,因此它已经在SerialTool中实现。Modbus通常用于将监控计算机与远程终端单元(RTU)连接在一起,用于监控控制和数据采集(SCADA)系统。根据数据传输的格式,该协议分为:

  • MODBUS RTU - 数据以十六进制格式传输。
  • MODBUS ASCII - 数据以ASCII格式传输。

两种情况下的错误控制不同;在MODBUS RTU中,使用循环冗余校验(CRC)并在命令之后发送,而在MODBUS ASCII中,则在命令之后发送纵向冗余校验(LRC)。

Modbus TCP传输

1999年,开发了"Modbus TCP",这是专为使用TCP/IP协议套件的网络而设计的标准。它实质上是基于TCP/IP的Modbus串行RTU的版本,可在互联网/内部网络上进行通信。近年来,TCP/IP版本越来越受欢迎,因为它是开源的,易于实现,开发成本低,并且对硬件支持要求较小。

两种情况下的错误控制不同;在MODBUS RTU中,使用循环冗余校验(CRC)并在命令之后发送,而在MODBUS ASCII中,则在命令之后发送纵向冗余校验(LRC)。

Modbus TCP/IP协议使用二进制编码数据和TCP/IP错误检测机制。与串行Modbus不同,TCP/IP版本是面向连接的,并允许在同一从设备上或在多个设备上同时执行。Modbus TCP/IP还使用主-从范例,此通信使用四种类型的消息。

Modbus定位在ISO/OSI协议栈的第7层(应用层),定义了称为帧格式的消息格式和数据和控制功能的传输模式。通信通过客户端-服务器范例进行。该协议定义了不依赖于底层通信层的协议数据单元(PDU)。应用数据单元(ADU)引入了用于寻址和错误控制的附加字段。

SerialTool Modbus客户端

SerialTool支持RTU、ASCII和Modbus TCP传输模式,以提供Modbus客户端的最大专业灵活性。
SerialTool还提供了发送原始命令的选项,以满足任何开发人员的需求。

发送命令的日志屏幕

发送的低级命令屏幕


Modbus功能

以下是SerialTool为Modbus协议实现的功能。

功能代码 动作 表名
0x01 读取 离散输出线圈
0x02 读取 离散输入接点
0x03 读取 模拟输出保持寄存器
0x04 读取 模拟输入寄存器
0x05 写单个 离散输出线圈
0x06 写单个 模拟输出保持寄存器
0x0F(十进制15) 写多个 离散输出线圈
0x10(十进制16) 写多个 模拟输出保持寄存器

Modbus数据结构

信息存储在服务器设备的四个不同的表中。两个表存储离散的开/关值(线圈),另外两个存储数值值(寄存器)。线圈和寄存器都有一个只读表和一个读写表。每个表有9999个值。每个线圈或接点占用1位,具有从0000到270E的数据地址。每个寄存器是1个字 = 16位 = 2字节,数据地址也在0000到270E之间。

线圈/寄存器编号 数据地址 类型 表名
1-9999 0x0000 至 0x270E 读/写 离散输出线圈
10001-19999 0x0000 至 0x270E 只读 离散输入接点
30001-39999 0x0000 至 0x270E 只读 模拟输入寄存器
40001-49999 0x0000 至 0x270E 读/写 模拟输出保持寄存器