ESP-IDF Modbus从站例子

支持的芯片型号ESP32ESP32-C2ESP32-C3ESP32-C6ESP32-H2ESP32-S2ESP32-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 masterRTS --+--->| 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地址、访问类型、参数结构中的存储地址和寄存器数量。

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

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

相关文章

Webpack5入门到原理20:Vue 脚手架搭建

开发模式配置 // webpack.dev.js const path require("path"); const ESLintWebpackPlugin require("eslint-webpack-plugin"); const HtmlWebpackPlugin require("html-webpack-plugin"); const { VueLoaderPlugin } require("vue-lo…

STL——list

1、list介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是带头双向循环链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后…

CVE-2023-46226 Apache iotdb远程代码执行漏洞

项目介绍 Apache IoTDB 是针对时间序列数据收集、存储与分析一体化的数据管理引擎。它具有体量轻、性能高、易使用的特点&#xff0c;完美对接 Hadoop 与 Spark 生态&#xff0c;适用于工业物联网应用中海量时间序列数据高速写入和复杂分析查询的需求。 项目地址 https://io…

Leetcoder Day9|栈与队列part01

语言&#xff1a;Java/C 目录 理论基础 C 栈 队列 Java 栈 队列 ​编辑 232.用栈实现队列 225. 用队列实现栈 Queue Deque 今日心得 理论基础 又是考研时数据结构里接触到的老朋友&#xff0c;栈是先进后出&#xff0c;队列是先进先出。 C 现在刷题除了思路还…

力扣-202. 快乐数解析-弗洛伊德循环查找算法

题目链接 public static void Happy(int n) {int sum 0;int digit 0;for (int i 0; i < 20; i) {while (n ! 0) {digit n%10;sum digit*digit;n/10;}System.out.print(sum " ");n sum;sum 0;}} 使用代码测试一下每一代数字 n 2 : 4 16 37 58 89 145 42 …

【笔记】Helm-3 主题-9 Helm高级技术

Helm高级技术 这部分解释说明了使用Helm的各种高级特性和技术。这部分旨在为Helm的高级用户提供高度自定义和操作chart及发布的信息。每个高级特性都会有它自己的权衡利弊&#xff0c; 因此每个使用它们的都要有Helm的深度知识并小心使用。或者换言之&#xff0c;谨记 Peter Pa…

医院挂号系统

需求&#xff1a; 科室管理&#xff1a;新增科室。医生管理&#xff1a;录入医生信息&#xff0c;以及科室信息。修改医生信息&#xff08;主要是修改个人信息和科室&#xff09;。坐诊信息设置&#xff1a;可以设置医生当天和未来6天的坐诊情况&#xff0c;包括上午和下午的坐…

自然语言处理(Natural Language Processing,NLP)解密

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

Servlet中service()与doGet() doPost() 是什么关系

Servlet&#xff08;Server Applet&#xff09;&#xff0c;全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据&#xff0c;生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口&#xff0c;广义的Servlet是指任何实现了这个Servlet…

关于去除信号中的直流分量效果演示(零频率分量)

本文作者&#xff1a; slience_me 文章目录 关于去除信号中的直流分量效果演示&#xff08;零频率分量&#xff09;1. 效果图展示&#xff1a;2. 快速傅里叶变换FFT3. 相关验证代码 关于去除信号中的直流分量效果演示&#xff08;零频率分量&#xff09; 1. 效果图展示&#x…

JDK 动态代理(Spring AOP 的原理)(面试重点)

代理模式 也叫委托模式.定义&#xff1a;为其他对象提供⼀种代理以控制对这个对象的访问.它的作⽤就是通过提供⼀个代理类,让我们 在调⽤⽬标⽅法的时候,不再是直接对⽬标⽅法进⾏调⽤,⽽是通过代理类间接调⽤&#xff0c;在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对…

51单片机蜂鸣器

蜂鸣器 蜂鸣器的工作原理 三极管的工作原理 三极管是一种半导体器件&#xff0c;通常由三个掺杂不同的半导体材料层构成。它常用于放大和开关电路中。三极管的工作原理可简述如下&#xff1a; 放大作用&#xff1a;三极管可以放大电流和电压信号。它的工作原理基于控制一个较大…

利用OpenGL图形库实现人物动画移动效果

使用OpenGL库实现人物动画移动效果需要涉及到更复杂的图形编程和事件处理。以下是一个简单的例子&#xff0c;使用OpenGL和GLUT库实现人物的基本动画移动效果。 确保你已经安装了OpenGL和GLUT。你可以使用包管理器或者从官方网站下载并安装。 一、如果你已经安装过了OpenGL和…

Web前端与低代码可以碰出什么火花?

技术快速迭代&#xff0c;Web前端开发已经逐渐成为构建现代应用程序的关键组成部分。它不仅涉及到美观的界面设计&#xff0c;还包括后端功能的实现&#xff0c;以及跨平台兼容性的考虑。然而&#xff0c;传统的Web前端开发过程往往需要进行长时间的编码和调试&#xff0c;这使…

LTC6820和isoSPI使用

1、MSTR主控/受控 MSTR (引脚 11/ 引脚 12)&#xff1a;串行接口主 / 从选择器输入。MSTR接VCC&#xff0c;则LTC6820为从机&#xff1b;MSTR接GND&#xff0c;则LTC6820为主机 2、SLOW慢速/快速 SLOW (引脚 12/ 引脚 13)&#xff1a;慢速接口选择输入。当时钟频率≤ 200kHz …

C++和Python最常用的库框架一览

一、C常用库 1. 标准模板库(STL) STL包含丰富的数据结构与算法。比如vector动态数组;list双向链表;map基于红黑树实现,支持快速查找键值对。常用算法有sort排序、find搜索等。这些容器算法类和函数模板,是C程序员必不可少的基础。 2. Boost Boost是近年兴起的高质量C库集合…

网络安全:守护数字世界的盾牌

在当今数字化的时代&#xff0c;网络已经渗透到我们生活的方方面面。从社交媒体到在线银行&#xff0c;从在线购物到工作文件传输&#xff0c;网络几乎无处不在。然而&#xff0c;随着网络的普及&#xff0c;网络安全问题也日益凸显。那么&#xff0c;如何确保我们的数字资产安…

递归、搜索与回溯算法(专题一:递归)

往期文章&#xff08;希望小伙伴们在看这篇文章之前&#xff0c;看一下往期文章&#xff09; &#xff08;1&#xff09;递归、搜索与回溯算法&#xff08;专题零&#xff1a;解释回溯算法中涉及到的名词&#xff09;【回溯算法入门必看】-CSDN博客 接下来我会用几道题&#…

gdb命令总结

1、启动调试 前置条件&#xff1a;编译生成执行码时带上 -g&#xff0c;如果使用Makefile&#xff0c;通过给CFLAGS指定-g选项&#xff0c;否则调试时没有符号信息。 gdb program //最常用的用gdb启动程序&#xff0c;开始调试的方式 gdb --args program args //带参数启动或…

Docker-安装实践(mysql,redis集群,tomcat)

docker实践(提供几个安装案例&#xff09; 安装Tomcat # 拉取镜像,可以指定标签不指定默认为最新 docker pull tomcat docker run -itd -p 8080:8080 --name tomcat tomcat:latest #这样内部默认80端口&#xff0c;主机的映射端口会随机分配一个 docker run -itd -P tomcat…