ESP-IDF Modbus 主站示例程序

支持的芯片型号ESP32ESP32-C2ESP32-C3ESP32-C6ESP32-H2ESP32-S2ESP32-S3

Modbus 主站示例程序

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

参数定义示例:

从机地址属性ID属性名称描述
MB_DEVICE_ADDR1CID_INP_DATA_0,Data_channel_0数据通道 1
MB_DEVICE_ADDR1CID_HOLD_DATA_0,Humidity_1湿度1
MB_DEVICE_ADDR1CID_INP_DATA_1Temperature_1传感器温度
MB_DEVICE_ADDR1CID_HOLD_DATA_1,Humidity_2湿度2
MB_DEVICE_ADDR1CID_INP_DATA_2Temperature_2环境温度
MB_DEVICE_ADDR1CID_HOLD_DATA_2Humidity_3湿度3
MB_DEVICE_ADDR1CID_RELAY_P1RelayP1报警继电器输出 on/off
MB_DEVICE_ADDR1CID_RELAY_P2RelayP2报警继电器输出 on/off

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

简单的Modbus连接示意图:

   MB_DEVICE_ADDR1-------------                -------------|           | RS485 network  |           ||  Slave  1 |---<>--+---<>---|  Master   ||           |                |           |-------------                -------------

一主多从Modbus连接示意图:

    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部分电路示意图:

         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 从机设备

如何设置和使用示例:

配置软件

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

idf.py menuconfig
  1. 使用下表用于modbus通信的UART引脚
  2. 在Kconfig中定义主机设备和从机设备的通信模式参数 - CONFIG_MB_COMM_MODE(主机设备和从机设备的模式必须相同)
  3. 为每个从机配置从机地址(Kconfig 中的 CONFIG_MB_SLAVE_ADDR)
  ------------------------------------------------------------------------------------------------------------------------------|  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文件,以配置上面“示例参数定义”表中定义的通信参数和从地址。

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

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

idf.py -p PORT flash monitor

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

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

示例输出

应用程序的示例输出:

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、属性名称(单位)和属性值(十六进制)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux编写简易shell

思路&#xff1a;​ ​ ​ 所以要写一个shell&#xff0c;需要循环以下过程:​ 获取命令行解析命令行建立一个子进程&#xff08;fork&#xff09;替换子进程&#xff08;execvp&#xff09;父进程等待子进程退出&#xff08;wait&#xff09; 实现代码&#xff1a;​ #inc…

从技术大会到面试舞台:程序猿的蜕变之旅!

在这个技术日新月异的时代&#xff0c;程序员们需要不断地学习和提升自己的技能。 参加技术大会&#xff0c;无疑是程序员们拓宽视野、提升技能的重要途径之一。然而&#xff0c;技术大会只是程序员成长的一部分&#xff0c;掌握面试技巧同样至关重要。只有将这两者完美结合&a…

Python入门到精通(三)——Python循环语句

Python循环语句 一、while 循环 1、基础语法 2、嵌套应用 二、for 循环 1、基础语法 2、嵌套应用 三、循环中断&#xff1a;break 和 continue 1、break 2、continue 四、综合案例 一、while 循环 1、基础语法 while的条件需得到布尔类型&#xff0c;True表示继续循环…

【STM32】| 02——常用外设 | I2C

系列文章目录 【STM32】| 01——常用外设 | USART 【STM32】| 02——常用外设 | I2C 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. 简介2. I2C协议2.1 I2C物理连接2.2 I2C通信协议2.2.1 起始和停止信号2.2.2 数据有效性2.2.3 数据传输格式2.2.4 从机地址/数据方…

文件泄漏

一、Windows中的文件锁定机制 在Java中操作文件流时&#xff0c;确保及时关闭文件流是非常重要的。在Windows系统上&#xff0c;由于文件锁定机制比较严格&#xff0c;如果一个文件流没有被关闭&#xff0c;可能会导致文件被锁定&#xff0c;从而阻止其它程序对文件的访问&…

学习Spring的第九天

Spring Bean的生命周期 Bean的实例化阶段 : 看配置文件里Bean标签的信息 , 来判断进行实例化(如是否有lazy-init , 或者是否是FactoryBean等等) (实际就是Bean标签表面的信息 , 即BeanDefinition) Bean的初始化阶段 : 对Bean的属性(重要 : BeanPostProcessor方法 , 及如下 , pr…

L1-059 敲笨钟(Java)

微博上有个自称“大笨钟V”的家伙&#xff0c;每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性&#xff0c;还会糟改几句古诗词。其糟改的方法为&#xff1a;去网上搜寻压“ong”韵的古诗词&#xff0c;把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰&…

什么是安全SCDN,有什么作用?

前两天有个站长被朋友推荐联系到了德迅云安全&#xff0c;想要对自己网站做一些安全防护&#xff0c;聊天中问及到了安全SCDN是什么意思&#xff0c;有哪些作用&#xff1f;那么德迅云安全今天就来简单讲述一下安全SCDN&#xff0c;来了解下什么是安全SCDN&#xff0c;以及它有…

vue3中l和vue2中v-model不同点

vue2比较让人诟病的一点就是提供了两种双向绑定&#xff1a;v-model和.sync&#xff0c; 在vue3中&#xff0c;去掉了.sync修饰符&#xff0c;只需要使用v-model进行双向绑定即可。 为了让v-model更好的针对多个属性进行双向绑定&#xff08;vue2中自定义组件中v-model只能使用…

一键拆分,轻松整理,高效管理文本文件,让工作更轻松!

在日常工作中&#xff0c;我们经常需要处理大量的文本文件。如何快速整理这些文件&#xff0c;方便管理和使用成为了关键问题。为此&#xff0c;我们为您推荐一款强大的一键拆分和整理工具&#xff0c;助您高效管理文本文件&#xff01; 首先&#xff0c;在首助编辑高手的主页面…

Java-IO流【登录注册小项目】

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

29、WEB攻防——通用漏洞SQL注入增删改查盲注延迟布尔报错

文章目录 盲注增删改查 盲注 概念&#xff1a;在注入过程中&#xff0c;获取的数据不能回显至前端页面&#xff0c;此时我们需要利用一些方法进行判断或尝试&#xff0c;这个过程被称为盲注。 解决&#xff1a;常规的联合查询注入不行的情况。 分类&#xff1a; 基于布尔的SQ…

原码,补码的乘法运算

目录 一.原码一位乘法 二.补码一位乘法 一.原码一位乘法 在手算10进制乘法中&#xff0c;我们是这样计算的&#xff1a; 这里的本质是因为&#xff1a; 0.211 0.985 所以0.211*0.985 对应&#xff1a; 0.000985 0.00985 …

【面试突击】硬件级别可见性问题面试实战(下:synchronized和volatile底层对原子性、可见性、有序性的保证)

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复…

CHS_01.2.2.1+调度的概念、层次

CHS_01.2.2.1调度的概念、层次 调度的概念、层次知识总览调度的基本概念调度的三个层次——高级调度![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6957fdec179841f69a0508914145da36.png)调度的三个层次——低级调度调度的三个层次——中级调度补充知识&#xff…

laravel8.*集成dingo

learnku中的dingo版本为2&#xff0c;不支持laravel8 实际上dingo已经出到了4&#xff0c;已经支持laravel9 社区活跃度已经不高了&#xff0c;本人特别讨厌重复造轮子&#xff0c;这里特此记录下 文档地址&#xff1a;https://learnku.com/docs/dingo-api/3.x github地址&…

9.1 Maven项目管理(❤❤❤❤)

9.1 Maven项目管理 1. Maven介绍2. 创建Maven项目2.1 创建2.2 结构分析3. Maven依赖管理3.1 简介3.2 设置下载镜像仓库4. 本地仓库与中央仓库5. Maven生命周期6. Maven插件技术1. Maven介绍

钡铼 楼宇暖通网关之 BACnet网关在空气源热泵智能控制系统中的应用介绍

前言 在刚刚过去的2023年&#xff0c;空气源热泵市场依然火爆&#xff0c;全线市场销量递增&#xff0c;各种新品层出不穷&#xff0c;市场认可度持续攀升&#xff0c;在整个采暖市场&#xff0c;空气源热泵已然成为当红明星。 热泵组管道比较复杂&#xff0c;传感器分布比较分…

路飞项目--02

补充&#xff1a;axios封装 # 普通使用&#xff1a;安装 &#xff0c;导入使用 const filmListreactive({result:[]}) axios.get().then() async function load(){let responseawait axios.get()filmList.resultresponse.data.results } # 封装示例&#xff1a;请求发出去之前…

(蓝桥杯每日一题)love

问题描述 马上就要到七夕情人节了&#xff0c;小蓝在这天想要心爱得男神表白&#xff0c;于是她写下了一个长度为n仅由小写字母组成的字符串。 她想要使这个字符串有 1314个 love 子序列但是马虎的小蓝却忘记了当前已经有多少个子序列为 love。 请你帮小蓝计算出当前字符串有多…