使用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 | 读/写 | 模拟输出保持寄存器 |