支持的芯片型号 | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 |
Modbus从站例子
此示例演示了使用FreeModbus协议栈来实现ESP32作为从站设备来进行通信,
该示例允许外部 Modbus主站使用 Modbus协议读取/写入的从站设备参数, “mb_example_common/modbus_params.h”头文件中,定义了可通过Modbus协议操作的参数,用户修改该文件来添加/删除自己的自定义参数。
这些在结构“holding_reg_params”、“input_reg_params”、“coil_reg_params”和“discrete_reg_params”中表示,分别用于保存寄存器、输入参数、线圈和离散输入。
app_main应用程序演示了如何启动Modbus协议,当参数发生变化时会通知主站设备。
FreeModbus 协议栈位于“components/freemodbus”文件夹中,包含“/port”文件夹,该文件夹中包含与 ESP32 连接的堆栈端口。 可以在 KConfig 文件中配置一些端口参数,以正确启动协议栈(有关详细信息,请参阅下面的说明)。
“examples/protocols/modbus/mb_example_common”文件夹中定义从站示例使用到的参数结构。
所需硬件 :
选项1:
PC (Modbus从站应用软件) + 连接到USB端口的USB串行适配器 + RS485线路驱动器 + ESP32开发板
MAX485线路驱动器芯片在下文中作为示例,但其他类似的芯片也可以使用。
选项2:
根据其README.md文件的说明配置了modbus_master示例应用程序,并将其烧录到ESP32开发板上。
注意: 在modbus_master示例中,可以编辑“Example Data (Object) Dictionary”来处理连接到Modbus段的从站设备的参数。
RS485示例电路示意图:
VCC ---------------+ +--------------- VCC | | +-------x-------+ +-------x-------+ RXD <------| RO | DIFFERENTIAL | RO|-----> RXD | B|---------------|B | TXD ------>| DI MAX485 | \ / | MAX485 DI|<----- TXD ESP32 board | | RS-485 side | | Modbus master RTS --+--->| DE | / \ | DE|---+ | | A|---------------|A | | +----| /RE | PAIR | /RE|---+-- RTS +-------x--------+ +-------x-------+ | | --- ---
如何设置和使用示例:
配置软件
输入下面的命令开始配置:
idf.py menuconfig
选择“Modbus示例配置”菜单项。
使用以下命令和表格配置用于 Modbus 通信的 UART 引脚。
------------------------------------------------------------------------------------------------------------------------------ | UART Interface | #define | Default pins for | Default pins for | External RS485 Driver Pin | | | | ESP32 (C6) | ESP32-S2 (S3, C3, C2, H2) | | | ----------------------|--------------------|-----------------------|---------------------------|---------------------------| | Transmit Data (TxD) | CONFIG_MB_UART_TXD | GPIO23 | GPIO9 | DI | | Receive Data (RxD) | CONFIG_MB_UART_RXD | GPIO22 | GPIO8 | RO | | Request To Send (RTS) | CONFIG_MB_UART_RTS | GPIO18 | GPIO10 | ~RE/DE | | Ground | n/a | GND | GND | GND | ------------------------------------------------------------------------------------------------------------------------------
注意: 每个目标芯片都有不同的GPIO引脚可用于UART连接。有关更多信息,请参阅所选目标的UART文档。
在 Kconfig 中定义Modbus communiction mode- CONFIG_MB_COMM_MODE(对于主站和从站应用程序必须相同)。
为示例应用程序设置Modbus slave address(对于示例脚本默认设置为 1)。
FreeModbus协议栈的通信参数(Component config->Modbus configuration)允许进行适当的配置,但通常使用默认设置就足够了。
请查看参数的帮助字符串以获取更多信息。
设置外部 Modbus主站软件
选项1:
根据应用程序中使用的端口配置参数配置外部Modbus主站软件。
例如,可以使用Modbus Poll应用程序与该示例一起使用。
选项2:
设置基于ESP32的电路板,并根据其README.md文件中的说明设置modbus_master示例配置。
设置一个或多个从站电路板,具有不同的从站地址,并将它们连接到相同的Modbus段(参见上文中的配置)。
注意:主站和从站示例应用程序的Modbus communiction mode参数必须相同,以便能够相互通信。
应用编译和烧写
构建项目并烧写程序到板上,然后运行监视器工具查看串行输出:
idf.py -p PORT flash monitor
(退出串行监视器, 输入 Ctrl-]
.)
有关配置和使用ESP-IDF构建项目的完整步骤,请参阅《Getting Started Guide》
示例输出
应用程序的示例输出:
I (13941) SLAVE_TEST: INPUT READ (13651163 us), ADDR:1, TYPE:8, INST_ADDR:0x3ffb2fd0, SIZE:2 I (13951) SLAVE_TEST: HOLDING READ (13656431 us), ADDR:1, TYPE:2, INST_ADDR:0x3ffb2fe0, SIZE:2 I (13961) SLAVE_TEST: INPUT READ (13665877 us), ADDR:3, TYPE:8, INST_ADDR:0x3ffb2fd4, SIZE:2 I (13971) SLAVE_TEST: HOLDING READ (13676010 us), ADDR:3, TYPE:2, INST_ADDR:0x3ffb2fe4, SIZE:2 I (13981) SLAVE_TEST: INPUT READ (13686130 us), ADDR:5, TYPE:8, INST_ADDR:0x3ffb2fd8, SIZE:2 I (13991) SLAVE_TEST: HOLDING READ (13696267 us), ADDR:5, TYPE:2, INST_ADDR:0x3ffb2fe8, SIZE:2 I (14001) SLAVE_TEST: COILS READ (13706331 us), ADDR:0, TYPE:32, INST_ADDR:0x3ffb2fcc, SIZE:8 I (14001) SLAVE_TEST: Modbus controller destroyed.
输出行描述了操作类型、时间戳、Modbus地址、访问类型、参数结构中的存储地址和寄存器数量。