前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【物联网设备端开发】ESP-IDF Modbus 主站示例程序

【物联网设备端开发】ESP-IDF Modbus 主站示例程序

作者头像
帐篷Li-物联网布道师
发布2024-03-20 08:09:38
2090
发布2024-03-20 08:09:38
举报
文章被收录于专栏:开源物联网平台开发

🌈 个人主页:帐篷Li 🔥 系列专栏:物联网设备端开发 💪🏻 gitee地址:IOTDeviceSDK物联网设备端开发工具包 🤵‍♂️ 物联网设备上云提供开箱即用接入SDK,提供物联网设备端开发工具包

支持的芯片型号

ESP32

ESP32-C2

ESP32-C3

ESP32-C6

ESP32-H2

ESP32-S2

ESP32-S3

Modbus主站例子

这个示例展示了使用FreeModbus协议栈来实现ESP32作为主站设备来进行通信, 该示例能读取和写入连接到Modbus线路从站设备的属性值。所有需要访问的参数都在在Modbus主站示例源文件的数据字典中定义。 这些参数以属性的形式表示,每个属性都有其名称和属性ID ,这些属性与连接到Modbus线路的从站设备的寄存器相关联。 此外,该示例实现了一个简单的控制算法,用于检查从设备的参数。如果holding_data0参数的值超出限制,则会发出警报(在从设备中的继电器上)。 值得注意的是,modbus参数的实例对于主站和从站示例是通用的,它们都位于examples/protocols/modbus/mb_example_common文件夹中。

参数定义示例:

从站地址

属性ID

属性名称

描述

MB_DEVICE_ADDR1

CID_INP_DATA_0,

Data_channel_0

数据通道 1

MB_DEVICE_ADDR1

CID_HOLD_DATA_0,

Humidity_1

湿度1

MB_DEVICE_ADDR1

CID_INP_DATA_1

Temperature_1

传感器温度

MB_DEVICE_ADDR1

CID_HOLD_DATA_1,

Humidity_2

湿度2

MB_DEVICE_ADDR1

CID_INP_DATA_2

Temperature_2

环境温度

MB_DEVICE_ADDR1

CID_HOLD_DATA_2

Humidity_3

湿度3

MB_DEVICE_ADDR1

CID_RELAY_P1

RelayP1

报警继电器输出 on/off

MB_DEVICE_ADDR1

CID_RELAY_P2

RelayP2

报警继电器输出 on/off

注意: 从站地址对于测试示例的所有参数都是相同的,但它可以在主站示例的“示例数据(对象)字典”表中更改,以寻址来自其他从站的参数。 从站示例中的 Kconfig Modbus slave address- CONFIG_MB_SLAVE_ADDR参数可创建多个Modbus从站设备。

简单的Modbus连接示意图:

代码语言:javascript
复制
   MB_DEVICE_ADDR1
   -------------                -------------
   |           | RS485 network  |           |
   |  Slave  1 |---<>--+---<>---|  Master   |
   |           |                |           |
   -------------                -------------

一主多从Modbus连接示意图:

代码语言:javascript
复制
    MB_DEVICE_ADDR1
    -------------
    |           |   
    |  Slave 1  |---<>--+
    |           |       |
    -------------       |
    MB_DEVICE_ADDR2     |
    -------------       |        -------------
    |           |       |        |           |
    |  Slave  2 |---<>--+---<>---|  Master   |
    |           |       |        |           |
    -------------       |        -------------
    MB_DEVICE_ADDR3     |
    -------------  RS485 network
    |           |       |
    |  Slave 3  |---<>--+
    |           |
    -------------

所需硬件 :

选项1: PC (Modbus从站应用软件) + 连接到USB端口的USB串行适配器 + RS485线路驱动器 + ESP32开发板

选项2: 首先,我们需要为几个ESP32开发板烧写modbus_slave示例,并确保它们具有独特的从站地址,以符合“连接示意图”中的定义。 其次,为了实现主从通信,我们需要将一个ESP32开发板烧写modbus_master示例。 此外,所有这些开发板都需要通过RS485线路进行连接,具体信息参见下文。

以下使用MAX485驱动芯片作为示例,但也可以使用其他类似的芯片。 主站设备和从站设备连接到RS485部分电路示意图:

代码语言:javascript
复制
         VCC ---------------+                               +--------------- VCC
                            |                               |
                    +-------x-------+               +-------x-------+
         RXD <------| RO            | DIFFERENTIAL  |             RO|-----> RXD
                    |              B|---------------|B              |
         TXD ------>| DI   MAX485   |    \  /       |    MAX485   DI|<----- TXD
ESP32 板子           |               |   RS-485 side |               |      外置PC(仿真器)USB转串口 或者
         RTS --+--->| DE            |    /  \       |             DE|---+  ESP32 从站板子
               |    |              A|---------------|A              |   |
               +----| /RE           |    PAIR       |            /RE|---+-- RTS
                    +-------x-------+               +-------x-------+
                            |                               |
                           ---                             --- 
                      Modbus 主站设备                  Modbus 从站设备

如何设置和使用示例:

配置软件

输入下面的命令开始配置:

代码语言:javascript
复制
idf.py menuconfig
  1. 使用下表用于modbus通信的UART引脚
  2. 在Kconfig中定义主站设备和从站设备的通信模式参数 - CONFIG_MB_COMM_MODE(主站设备和从站设备的模式必须相同)
  3. 为每个从站配置从站地址(Kconfig 中的 CONFIG_MB_SLAVE_ADDR)
代码语言:javascript
复制
  ------------------------------------------------------------------------------------------------------------------------------
  |  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文档。 将USB转RS485适配器连接到计算机,然后将适配器的A/B输出线与连接到ESP32芯片的RS485线路的相应A/B输出线连接(见图)。 Modbus协议栈的通信参数允许对其进行适当配置,但通常使用默认设置就足够了。 有关详细信息,请参阅参数的帮助字符串。

设置外部Modbus从站设备或仿真器

选项1: 根据示例中使用的端口配置参数配置外部Modbus主软件。Modbus Slave应用程序可与此示例一起使用,以通过其参数模拟从属设备。使用软件的官方文档来设置从属设备的仿真。

选项2: 另一种选择是将modbus_slave示例应用程序闪存到基于ESP32的板中,并将板连接在一起,如上面的modbus连接示意图所示。请参阅Modbus从API文件,以配置上面“示例参数定义”表中定义的通信参数和从地址。

主站设备的应用编译和烧写

构建项目并烧写程序到板上,然后运行监视器工具查看串行输出:

代码语言:javascript
复制
idf.py -p PORT flash monitor

(退出串行监视器, 输入 Ctrl-].)

有关配置和使用ESP-IDF构建项目的完整步骤,请参阅《Getting Started Guide》

示例输出

应用程序的示例输出:

代码语言:javascript
复制
I (9035) MASTER_TEST: Characteristic #0 Data_channel_0 (Volts) value = 1.120000 (0x3f8f5c29) read successful.
I (9045) MASTER_TEST: Characteristic #1 Humidity_1 (%rH) value = 5.539999 (0x40b147ac) read successful.
I (9045) MASTER_TEST: Characteristic #2 Temperature_1 (C) value = 2.340000 (0x4015c28f) read successful.
I (9055) MASTER_TEST: Characteristic #3 Humidity_2 (%rH) value = 2.560000 (0x4023d70a) read successful.
I (9065) MASTER_TEST: Characteristic #4 Temperature_2 (C) value = 3.560000 (0x4063d70a) read successful.
I (9075) MASTER_TEST: Characteristic #5 Humidity_3 (%rH) value = 3.780000 (0x4071eb85) read successful.
I (9085) MASTER_TEST: Characteristic #6 RelayP1 (on/off) value = OFF (0x55) read successful.
I (9095) MASTER_TEST: Characteristic #7 RelayP2 (on/off) value = OFF (0xaa) read successful.
I (9605) MASTER_TEST: Characteristic #0 Data_channel_0 (Volts) value = 1.120000 (0x3f8f5c29) read successful.
I (9615) MASTER_TEST: Characteristic #1 Humidity_1 (%rH) value = 5.739999 (0x40b7ae12) read successful.
I (9615) MASTER_TEST: Characteristic #2 Temperature_1 (C) value = 2.340000 (0x4015c28f) read successful.
I (9625) MASTER_TEST: Characteristic #3 Humidity_2 (%rH) value = 2.560000 (0x4023d70a) read successful.
I (9635) MASTER_TEST: Characteristic #4 Temperature_2 (C) value = 3.560000 (0x4063d70a) read successful.
I (9645) MASTER_TEST: Characteristic #5 Humidity_3 (%rH) value = 3.780000 (0x4071eb85) read successful.
I (9655) MASTER_TEST: Characteristic #6 RelayP1 (on/off) value = OFF (0x55) read successful.
I (9665) MASTER_TEST: Characteristic #7 RelayP2 (on/off) value = ON (0xff) read successful.
I (10175) MASTER_TEST: Alarm triggered by cid #7.
I (10175) MASTER_TEST: Destroy master...

这个例子演示了当从站设备没有触发报警时,会读取其属性(请参阅“示例参数定义”)。输出行包括时间戳、属性ID、属性名称(单位)和属性值(十六进制)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Modbus主站例子
    • 参数定义示例:
      • 所需硬件 :
        • 如何设置和使用示例:
          • 配置软件
          • 设置外部Modbus从站设备或仿真器
          • 主站设备的应用编译和烧写
        • 示例输出
        相关产品与服务
        物联网
        腾讯连连是腾讯云物联网全新商业品牌,它涵盖一站式物联网平台 IoT Explorer,连连官方微信小程序和配套的小程序 SDK、插件和开源 App,并整合腾讯云内优势产品能力,如大数据、音视频、AI等。同时,它打通腾讯系 C 端内容资源,如QQ音乐、微信支付、微保、微众银行、医疗健康等生态应用入口。提供覆盖“云-管-边-端”的物联网基础设施,面向“消费物联”和 “产业物联”两大赛道提供全方位的物联网产品和解决方案,助力企业高效实现数字化转型。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档