ESP32 搞定 Modbus,别再自己造轮子了!这个官方神器让你爽到飞起!

 

嘿,各位在座的嵌入式大神和准大神们
今天想跟大家唠个嗑,聊一个让咱们又爱又恨的老朋友——Modbus。

说起 Modbus,那真是工业控制领域的“普通话”,简单、粗暴、有效。但你要是在 ESP32 上自己从零开始捣鼓它,那滋味……啧啧,我跟你说,简直是一把辛酸泪。什么 CRC 校验算不对啦,什么主从机时序对不上啦,什么半双工通信的收发切换搞得你怀疑人生啦……(我当年为了调个时序,头发都快掉光了)。

你是不是也经历过,为了一个 Modbus 通信,对着示波器一看就是一天,最后发现是某个犄角旮旯的延时函数写错了?

但是!时代变了,朋友们!乐鑫官方亲自下场,给我们端上来一盘硬菜——esp-modbus 库!

这玩意儿,怎么说呢,就是官方帮你把所有脏活累活全干了,你只需要优雅地调用几个 API,就能轻松玩转 Modbus。今天,我就带大家好好盘一盘这个神器,保证你看完就能上手,项目开发效率直接起飞!

告别“野路子”,拥抱“正规军”

以前咱们用 ESP-IDF,可能会用到一个叫 freemodbus 的组件。那玩意儿也还行,但说实话,有点老了,而且用起来总感觉不是那么“亲生”的。

现在这个 esp-modbus 可不一样,它是乐鑫 component 仓库里正儿八经的“上架产品”。啥意思?就是说,你不用再去 GitHub 上下载 zip 包,手动复制粘贴了。直接在你的项目里敲一行命令:

idf.py add-dependency espressif/esp-modbus

“嗖”的一下,它就自动下载、安装、配置好了。这种丝滑的感觉,就像夏天喝第一口冰可乐,一个字:爽!

这里有个小坑,我得提醒一下:如果你用的是比较老的 ESP-IDF v4.x 版本,它里面可能还藏着那个旧的 freemodbus。为了避免冲突,你得在项目的 CMakeLists.txt 文件里加一句,把它“踢”出去:

set(EXCLUDE_COMPONENTS freemodbus)

不过,现在大家都用 v5.x 了吧?那就啥也不用管,直接用就完事了!

这玩意儿到底牛在哪?

光说方便可体现不出我的“院士级”水平。esp-modbus 真正的牛逼之处在于它的设计思想,完全是面向现代嵌入式开发的。

1. 多实例,随便开!

以前那个老版本,全局就一个实例,想在一个 ESP32 上同时搞几个 Modbus Master 或者 Slave?门儿都没有!这在稍微复杂点的网关项目里,简直就是噩梦。

现在呢?esp-modbus 的 API 焕然一新。你每次初始化,它都会返回一个句柄(handle),这个句柄就代表一个独立的 Modbus 实例。想开多少个就开多少个,每个实例的串口、波特率、TCP 端口都可以不一样。这操作,跟咱们平时开线程、new 对象似的,自由度直接拉满!

2. 接口通吃,来者不拒

不管你是搞传统的 RS485 串口通信,还是玩时髦的 Modbus TCP/IP,它都给你安排得明明白白。

  • • Modbus Serial:支持 RTU 和 ASCII 两种模式,主从机角色随便你当。

  • • Modbus TCP:直接跑在 Wi-Fi 或者以太网上,让你的设备轻松上云,接入工业互联网。

等于说,一个库,就把物理层到应用层的活儿基本都包了。

光说不练假把式,上手实战!

理论说了这么多,咱们来点实际的。假设我们要用 ESP32 做一个 Modbus RTU 从机,通过 RS485 跟上位机通信。

第一步:搭个电路

这个太简单了,搞嵌入式的闭着眼都能画出来。核心就是一片 MAX485 或者类似的 RS485 转换芯片。

简单说就是:

  • • ESP32 的 TXD 接到 MAX485 的 DI。

  • • ESP32 的 RXD 接到 MAX485 的 RO。

  • • ESP32 的一个 GPIO(比如 GPIO18)接到 MAX485 的 DE/RE,用来控制收发切换。

第二步:配置你的项目

硬件连好了,就该动动手指了。在你的项目目录下,运行 idf.py menuconfig。

然后找到 Modbus Example Configuration 这个菜单。这里面,你需要把刚才连接的几个 GPIO 口配置对。官方文档给的默认配置是这样的,你可以参考下:

UART 接口

Kconfig 选项

ESP32 (C6) 默认引脚

ESP32-S2/S3 等默认引脚

RS485 芯片引脚

发送数据 (TxD)

CONFIG_MB_UART_TXD

GPIO23

GPIO9

DI

接收数据 (RxD)

CONFIG_MB_UART_RXD

GPIO22

GPIO8

RO

请求发送 (RTS)

CONFIG_MB_UART_RTS

GPIO18

GPIO10

~RE/DE

地线 (GND)

n/a

GND

GND

GND

千万别配错了! 我见过太多人程序没问题,结果就是因为一根线接错或者配置错,调试一下午。

第三步:看懂官方示例

官方的例子写得特别好,路径在 examples/protocols/modbus/serial/。

你主要关注 mb_example_common/modbus_params.h 这个文件。所有的 Modbus 寄存器(线圈、离散量、输入寄存器、保持寄存器)都在这里定义。你想让上位机读写什么数据,就在这里加。比如你想加一个温度传感器的值,就在 holding_reg_params 结构体里加个成员变量就行了。

然后主程序 app_main 里,就是初始化 Modbus 协议栈,设置通信参数,然后就等着上位机来“翻牌子”了。

当你用 Modbus Poll 之类的上位机软件去读写 ESP32 的时候,串口会打印出类似这样的日志:

I (13951) SLAVE_TEST: HOLDING READ (13656431 us), ADDR:1, TYPE:2, INST_ADDR:0x3ffb2fe0, SIZE:2
I (14001) SLAVE_TEST: COILS READ (13706331 us), ADDR:0, TYPE:32, INST_ADDR:0x3ffb2fcc, SIZE:8

你看这日志,清清楚楚,哪个从机地址,是读还是写,操作的寄存器类型,数据长度,一目了然。调试起来简直不要太方便!

总结一下

总而言之,esp-modbus 这个库,对于我们这些用 ESP32 做产品,尤其是工业、物联网相关产品的开发者来说,绝对是个福音。它:

  • • 官方出品,稳定可靠:不用担心奇奇怪怪的 bug。

  • • 集成方便,开箱即用:一条命令搞定,省时省心。

  • • 设计现代,功能强大:多实例、多接口,满足各种复杂需求。

  • • 示例清晰,上手极快:跟着例子跑一遍,基本就掌握了。

所以说,兄弟们,别再抱着老旧的库或者自己造的轮子不放了。拥抱变化,用好官方提供的强大工具,把宝贵的时间和精力花在更有创造性的业务逻辑上,这才是咱们工程师价值的体现,对吧?

别犹豫了,赶紧打开你的 VS Code,敲下那行命令,去体验一下什么叫“丝般顺滑”的 Modbus 开发吧!


项目地址: https://github.com/espressif/esp-modbus

 

发表评论