ESP-IDF Modbus从站例子

简介: ESP-IDF Modbus从站例子
支持的芯片型号 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地址、访问类型、参数结构中的存储地址和寄存器数量。

目录
相关文章
|
传感器 算法 API
ESP-IDF Modbus 主站示例程序
ESP-IDF Modbus 主站示例程序
341 0
|
监控 安全 算法
Java并发基础:LinkedTransferQueue全面解析!
LinkedTransferQueue类实现了高效的线程间数据传递,支持等待匹配的生产者-消费者模式,基于链表的无界设计使其在高并发场景下表现卓越,且无需担心队列溢出,丰富的方法和良好的可扩展性满足了各种复杂应用场景的需求。
305 2
Java并发基础:LinkedTransferQueue全面解析!
|
监控 芯片 Windows
保姆级ESP-IDF开发环境搭建
保姆级ESP-IDF开发环境搭建
1004 1
|
机器学习/深度学习 人工智能 算法
通俗认识理解OpenAI Five
通俗认识理解OpenAI Five
570 0
|
12月前
【LVGL快速入门】LVGL开源框架入门教程之框架移植(二)
【LVGL快速入门】LVGL开源框架入门教程之框架移植(二)
654 2
|
12月前
|
存储 C++ Python
[oeasy]python037_ print函数参数_sep分隔符_separator
本文介绍了Python中`print`函数的`sep`参数,即分隔符。通过回顾上文内容,解释了类型与`type`的概念,并强调了参数类型的重要性。文章详细探讨了`print`函数如何使用`sep`参数来分隔输出值,默认分隔符为空格(序号32)。还讨论了如何修改分隔符为其他字符,如冒号,并解释了为何反斜杠需要使用双反斜杠表示。最后,文章追溯了`sep`名称的由来,以及相关词汇的历史背景,如盎格鲁-萨克逊人的武器和语言。
342 1
|
算法 API 开发工具
ArcFace
ArcFace 是虹软公司开发的一款人脸识别 SDK,它具有高性能、高精度、高鲁棒性等特点,支持多种人脸检测、识别和跟踪技术,可用于多种场景,如手机解锁、身份认证、人脸支付等。
545 1
|
SQL 关系型数据库 MySQL
PowerDesigner16.5逆向工程导入
本文介绍了如何通过现有数据库或SQL将数据逆向导入PowerDesigner。首先,需下载并安装PowerDesigner 16.5(32位),并通过指定链接获取软件及教程。接着,安装对应的MySQL ODBC驱动,配置ODBC数据源。最后,在PowerDesigner中通过文件&gt;反向工程&gt;database选项导入数据库。若环境不匹配,可直接导入SQL脚本文件。文中提供了详细步骤与截图指导。
424 0
|
资源调度 前端开发 JavaScript
Tailwind CSS如何在vue项目中使用
Tailwind CSS如何在vue项目中使用
727 8
|
存储 传感器 人工智能
ESP32 使用RS485模块实现Modbus通信
ESP32 使用RS485模块实现Modbus通信
840 0