高效的数据交互离不开精心设计的通信消息。本章聚焦Air8000 Modbus数据区及消息帧的创建,解析寄存器地址定义、消息结构优化等要点,结合主从交互案例,分享提升通信效率与稳定性的实用技巧。
一、MODBUS 概述
Modbus 是一种广泛应用于工业自动化领域的串行通信协议,由 Modicon 公司(现为施耐德电气旗下)于 1979 年推出,主要用于可编程逻辑控制器(PLC)与工业设备之间的通信。其设计简单、开放、易于实现,成为工业通信的事实标准。
1. 1 核心特点
主从架构:由主设备(Master)发起请求,从设备(Slave)响应,支持单主或多从模式。
典型应用:一台工控机(主)与多个传感器/执行器(从)通信。
1.2 常用协议变体
Modbus RTU:基于二进制编码,通过串行接口(RS-232/RS-485)传输,紧凑高效。
Modbus ASCII:使用 ASCII 字符编码,可读性强但效率低。
Modbus TCP/IP:基于以太网,适用于现代工业网络。
协议类型对比:

1.3 数据模型
1.3.1 Modbus 定义四种数据类型,每种通过不同功能码访问:
线圈(Coils):可读可写的布尔量(功能码 01 读,05 写单个,15 写多个)。
离散输入(Discrete Inputs):只读布尔量(功能码 02 读)。
保持寄存器(Holding Registers):可读可写的 16 位整数(功能码 03 读,06 写单个,16 写多个)。
输入寄存器(Input Registers):只读的 16 位整数(功能码 04 读)。
1.3.2 简单报文结构
请求帧:功能码 + 数据地址 + 数据长度 + CRC 校验(RTU)或 TCP 头(Modbus TCP)。
响应帧:功能码 + 返回数据 + 校验。
1.4 优缺点
1.4.1 优点:
开放免费,兼容性强。
在多种电气接口(RS232、RS485)及多种通信介质(以太网,串行电路,蓝牙,wifi 等)中运行 。
报文帧简单紧凑。
1.4.2 缺点:
无内置安全机制(需依赖网络隔离或加密层)。
仅支持基础数据类型(需扩展协议处理浮点数等)。
二、演示功能概述
本篇文章演示的内容为:通过 RTU、ASCII 和 TCP 三种常用协议,Air8000 开发板作为主站(客户端)与从站连接通讯的过程,或开发板作为从站(服务器)与主站连接通讯的过程。
三、准备硬件环境
3.1 硬件准备
参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。(硬件环境清单:https://docs.openluat.com/air8000/luatos/common/hwenv/)
485/232 转 USB:

网线:

3.2 开发板组合演示
3.2.1 RTU 协议和 ASCII 协议测试连接

3.2.2 TCP 协议测试连接

四、准备软件环境
在开始实践本示例之前,先筹备一下软件环境:
-
Luatools 工具;
-
LuatOS-SoC_V2014_Air8000_2;此页面有新版本固件的话选用最新版本固件。
3.LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/modbus
4.lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
准备好软件环境之后,接下来查看(如何烧录项目文件到 Air8000 开发板中:https://docs.openluat.com/air8000/luatos/common/download/),将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。
5.上位机下位机模拟软件:https://gulink.cn/
5.1 API 接口介绍
https://docs.openluat.com/osapi/core/modbus/
5.2 代码解析
5.2.1 RTU
5.2.1.1 MASTER_RTU
1.初始化通讯串口

2.Modbus 主站创建

3.添加从站

4.创建数据区和通信消息

5.启动 Modbus 设备

6.定时状态检查

7.数据读取并转化为 json

5.2.1.2 SLAVE_RTU
1.初始化设置

2.Modbus 从站创建:创建了一个 RTU 模式的 Modbus 从站,添加了两个数据块:保持寄存器区和线圈区

3.启动 modbus 从站

4.数据更新

5.2.1 ASCII
5.2.2.1 MASTER_ASCII
1.初始化通讯串口

2.Modbus 主站创建

3.添加从站

4.创建数据区和通信消息

5.启动 Modbus 设备

6.定时状态检查

7.数据读取并转化为 json

5.2.2.2 SLAVE_ASCII
1.初始化设置

2.Modbus 从站创建:创建了一个 RTU 模式的 Modbus 从站,添加了两个数据块:保持寄存器区和线圈区

3.启动 modbus 从站

4.数据更新

5.2.3 TCP
5.2.3.1 MASTER_TCP
1.初始化

2.SPI 和以太网驱动初始化

3.创建主站

4.添加从站

5.创建数据请求消息

6.启动 Modbus 主站

7.从站状态监控

8.数据处理

5.2.3.2 SLAVE_TCP
1.网络硬件初始化

2.SPI 和网络驱动初始化

3.等待网络连接

4.IP 地址配置

5.DHCP 和 DNS 服务

6.系统监控任务

7.创建 Modbus TCP 从站

8.创建数据存储区

9.启动 Modbus 从站

10.定时数据更新

六、运行结果展示
6.1 RTU 协议运行结果
6.1.1 modbus.master_rtu
6.1.1.1 完整代码展示

6.1.1.2 效果展示
1.打开 MThings(第四章中 第五项提到的上位机下位机软件 摩尔信使),界面如下。

2.点击右上角进入通道管理。

3.点击通道管理。

4.进入后可以看到 4 个 com 口,选择 485 通道的 com 口进行配置。

由设备管理器可知 485 通道是 com20

5.点入配置,按照代码中 uart.setup 设置参数后,点击确定即可,设置完毕后在通道管理界面配置的通道显示属于正常状态,用户如果接的是自己的下位机,请将 uart.setup 传入的参数成自己下位机的配置参数。

6.返回初始界面,点击添加设备。

7.通道选择刚刚配置过的 485 通道 COM20,设备类型是模拟从机,地址是添加从站的 id。

8.增加数据配置,数据条目是寄存器的数量。

点击确定后可以看到增加了 4 个条目,双击数值一栏,然后再双击固定值一栏即可按需选择模拟数据的方法。


9.数据配置完成后,在主界面可以看到数值按照设置的通讯时间间隔开始变换,在日志中也可以看到收到的数据,modbus 连接和通讯成功。

6.1.2 modbus.slave_rtu
6.1.2.1 完整代码展示

6.1.2.2 效果展示
1.打开 MThings(第四章中 第五项提到的上位机下位机软件 摩尔信使),界面如下。

2.点击右上角进入通道管理。

3.点击通道管理。

4.进入后可以看到 4 个 com 口,选择 485 通道的 com 口进行配置。

由设备管理器可知 485 通道是 com20

5.点入配置,按照代码中 uart.setup 设置参数后,选择 RTU 传输协议,点击确定即可,设置完毕后在通道管理界面配置的通道显示属于正常状态。用户如果接的是自己的下位机,请将 uart.setup 传入的参数成自己下位机的配置参数。

6.返回初始界面,点击添加设备。

7.通道选择刚刚配置过的 485 通道 COM20,设备类型是模拟主站,地址是创建从站的 id。

8.增加数据配置,根据需要选择读取的寄存器与线圈数据。


9.添加成功后,双击数值栏就可以获取目前从站的数据了,开发板做从站和主站连接通讯成功。

6.2 ASCII 协议运行结果
6.2.1 modbus.master_ascii
6.2.1.1 完整代码展示

6.2.1.2 效果展示
1.打开 MThings(第四章中 第五项提到的上位机下位机软件 摩尔信使),界面如下。

2.点击右上角进入通道管理。

3.点击通道管理。

4.进入后可以看到 4 个 com 口,选择 485 通道的 com 口进行配置。

由设备管理器可知 485 通道是 com20

5.点入配置,按照代码中 uart.setup 设置参数后,选择 ASCII 传输协议,点击确定即可,设置完毕后在通道管理界面配置的通道显示属于正常状态。用户如果接的是自己的下位机,请将 uart.setup 传入的参数成自己下位机的配置参数。

6.返回初始界面,点击添加设备。

7.通道选择刚刚配置过的 485 通道 COM20,设备类型是模拟从机,地址是添加从站的 id。

8.增加数据配置,数据条目是寄存器的数量。

点击确定后可以看到增加了 4 个条目,双击数值一栏,然后再双击固定值一栏即可按需选择模拟数据的方法


9.数据配置完成后,在主界面可以看到数值按照设置的通讯时间间隔开始变换,在日志中也可以看到收到的数据,modbus 连接和通讯成功。


6.2.2 modbus.slave_ascii
6.2.2.1 完整代码展示

6.2.2.2 效果展示
1.打开 MThings(第四章中 第五项提到的上位机下位机软件 摩尔信使),界面如下。

2.点击右上角进入通道管理。

3.点击通道管理。

4.进入后可以看到 4 个 com 口,选择 485 通道的 com 口进行配置。

由设备管理器可知 485 通道是 com20

5.点入配置,按照代码中 uart.setup 设置参数后,选择 ASCII 传输协议,点击确定即可,设置完毕后在通道管理界面配置的通道显示属于正常状态。用户如果接的是自己的下位机,请将 uart.setup 传入的参数成自己下位机的配置参数。

6.返回初始界面,点击添加设备。

7.通道选择刚刚配置过的 485 通道 COM20,设备类型是模拟主站,地址是创建从站的 id。

8.增加数据配置,根据需要选择读取的寄存器与线圈数据。


9.添加成功后,双击数值栏就可以获取目前从站的数据了,开发板做从站和主站连接通讯成功。

6.3 TCP 协议运行结果
6.3.1 modbus.master_tcp
6.3.1.1 完整代码展示
mian.lua

lan.lua

6.3.1.2 效果展示
1.打开 MThings(第四章中 第五项提到的上位机下位机软件 摩尔信使),界面如下。

2.点击右上角进入通道管理。

3.点击通道管理。

4.进入后选择网络通道,然后进行网络参数配置。

5.连接模式选择 tcp 服务器,本地 ip 在把脚本烧录后可以看到开发板分配的 ip,端口号设置为代码中 mb_slave1 = modbus.add_slave(mb_tcp, 1, "192.168.4.100", 6000)创建从站的端口号。

6.返回初始界面,点击添加设备。

7.通道选择刚刚配置的 NET001 网络通道,设备类型是模拟从机,地址是创建从站的 id。

8.增加数据配置,根据需要选择寄存器或线圈数据。

9.点击确定后可以看到增加了 4 个条目,双击数值一栏,然后再双击固定值一栏即可按需选择模拟数据的方法。


10.设置完成后则可以看到模拟从机数据开始变化,日志上显示开发板获取数据,主站与从站连接通讯成功。

6.3.2 modbus.slave_tcp
6.3.2.1 完整代码展示
main.lua

lan.lua

6.3.2.2 效果展示
1.打开 MThings(第四章中 第五项提到的上位机下位机软件 摩尔信使),界面如下。

2.点击右上角进入通道管理。

3.点击通道管理。

4.进入后选择网络通道,然后进行网络参数配置。

5.连接模式选择 tcp 客户端,本地 ip 在把脚本烧录后可以看到开发板分配的 ip,目标 ip 是开发板的 IP,为 192.168.4.1,目标端口号为脚本中 mb_tcp_s = modbus.create_slave(modbus.MODBUS_TCP, slave_id, 6000, socket.LWIP_ETH)设置的。

6.返回初始界面,点击添加设备。

7.通道选择刚刚配置的 NET001 网络通道,设备类型是模拟主站,地址是创建从站的 id。

8.增加数据配置,根据需要选择寄存器或线圈数据。


9.点击数值栏获取到从站寄存器和线圈的数据,主站与从站连接与通讯成功。

七、总结
本教程演示了 Air8000 modbus 在 RTU、ASCII 和 TCP 三种协议下的使用过程,请根据具体场景选择您需要的 demo 即可。
八、常见问题
1.删除从站地址和句柄位删除失败
删除失败可能是主站为关闭,删除从站需要在主站关闭后,删除后可再次打开主站观察从站是否删除成功。
2.开发板用 TCP 协议,如何修改开发板与 PC 端的连接方式
在 lan.lua 中修改 socket API。
今天的内容就分享到这里了!