news 2026/9/11 21:20:11

modbus-esp8266 API终极速查表:readHreg、writeCoil、push/pull一览无余

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
modbus-esp8266 API终极速查表:readHreg、writeCoil、push/pull一览无余

modbus-esp8266 API终极速查表:readHreg、writeCoil、push/pull一览无余

【免费下载链接】modbus-esp8266Most complete Modbus library for Arduino. A library that allows your Arduino board to communicate via Modbus protocol, acting as a master, slave or both. Supports network transport (Modbus TCP) and Serial line/RS-485 (Modbus RTU). Supports Modbus TCP Security for ESP8266/ESP32.项目地址: https://gitcode.com/gh_mirrors/mo/modbus-esp8266

modbus-esp8266是 Arduino 平台最完整的 Modbus 协议库,让 ESP8266 / ESP32 单板即可充当 Modbus 主站或从站,同时支持 Modbus RTU(RS-485 串口)与 Modbus TCP(WiFi/以太网)两种传输,并内置 Modbus TCP Security 安全扩展。本文以速查表形式整理其核心 API:从readHreg、writeCoil读写接口,到push/pull数据中转、task() 异步机制与回调函数,一篇看全。

📌 完整接口签名见 documentation/API.md,核心类与功能码定义见 src/Modbus.h。

30秒入门:4 种寄存器类型

Modbus 只有 4 类寄存器,所有 API 都是围绕它们设计的:

名称功能码类型特点
CoilCOIL(n)0x01 读 / 0x05 写bool可读可写,控制输出
IstsISTS(n)0x02bool只读,离散输入
HregHREG(n)0x03uint16_t可读可写,保持寄存器
IregIREG(n)0x04uint16_t只读,输入寄存器

💡 注意:Modbus 标准只有"位"和"16 位"两种数据类型。floatuint32_t等有符号/浮点值需要拆分成多个 16 位寄存器传输。

服务端速查:addHreg 与本地寄存器读写

作为从站(server/slave),先注册本地寄存器,再用同名函数读写:

操作API说明
注册addHreg(offset, value, numregs)建立从站地址空间,Coil/Ists/Ireg 同理
写本地Hreg(offset, value)Coil(offset, bool)IstsIreg同理
读本地Hreg(offset)单参重载即读,返回uint16_t
删除removeHreg(offset, numregs)从地址空间移除寄存器

这些接口的完整签名可参考 src/Modbus.h。

客户端读写:readHreg 与 writeCoil 怎么用

作为主站(master/client),调用格式高度统一:读写函数(从站ID, 起始地址, 值/数组指针, 寄存器数, 事务回调)

操作API对应功能码
读线圈readCoil(slaveId, offset, value, numregs, cb)0x01
读离散输入readIsts(slaveId, offset, value, numregs, cb)0x02
读保持寄存器readHreg(slaveId, offset, value, numregs, cb)0x03
读输入寄存器readIreg(slaveId, offset, value, numregs, cb)0x04
写单个线圈writeCoil(slaveId, offset, value, cb)0x05
写单个寄存器writeHreg(slaveId, offset, value, cb)0x06
批量写writeCoil(slaveId, offset, value, numregs, cb)0x0F / 0x10

批量写重载会根据numregs自动选择单写或多写功能码,无需手动区分。Modbus TCP 模式下,把slaveId换成IPAddress(可加uint单元标识参数)即可直连对端。

push/pull 数据中转:一行代码完成"远程↔本地"复制

push/pull 是最容易混淆的一组接口,记住一个方向口诀即可:

  • pull= 把远程数据拉下来,存进本地寄存器:pullHreg(slaveId, from, to, numregs)from是远程起始地址,to是本地保存地址
  • push= 把本地数据推上去,写到远程:pushHreg(slaveId, to, from, numregs)to是远程地址,from是本地数据地址
  • 跨类型中转同样支持:pullCoilToIstspushIregToHregpullIstspushIstsToCoil

🔧 典型场景:做 TCP 到 RTU 的协议桥接、把传感器数据自动缓存到本地寄存器,都靠它一行解决,官方桥接示例见 examples/Bridge/。

别忘了 task():异步调用工作流

这是新手最常踩的坑:所有 read/write/pull/push 都是异步的readHreg()只是发出请求就立刻返回,真正的应答处理由task()完成。所以loop()里必须周期性调用:

void loop() { if (!mb.slave()) { // 无进行中的请求时才发新请求 mb.readCoil(1, 1, coils, 20, cbWrite); } mb.task(); // 处理应答、触发事务回调 yield(); }

上面的完整主站示例可参考 examples/RTU/master/master.ino,从站示例见 examples/RTU/slave/slave.ino。

图:服务端 task() 收到请求后的处理流程(onRequest 回调 → 参数校验 → 准备应答 → 触发 onGet/onSet 回调)

⚠️ 两个高频现象都是异步机制的正常表现:

  1. 调用 readHreg 后立刻读值读不到—— 应答可能还没回来,由task()异步填充;
  2. 连续调用多次 read/write 只有第一次执行—— 同一时间只允许一个请求在途,task()处理完前请等待。

回调速查:onSetHreg、onGetCoil 与事务通知

回调触发时机
onSetCoil / onSetHreg / onSetIsts / onSetIreg(addr, cb, numregs)本地寄存器被写
onGetCoil / onGetHreg / onGetIsts / onGetIreg(addr, cb, numregs)本地寄存器被读
事务回调cbTransaction每个 read/write/push/pull 请求结束时(成功或超时)
onConnect / onDisconnectTCP 服务器连接建立/断开事件

在回调内调用eventSource()可获取请求来源:RTU 下返回从站 ID,TCP 下返回对方 IP(超时事务返回INADDR_NONE)。回调用法示例见 examples/Callback/onGetShared/onGetShared.ino 与 examples/Callback/onSet/onSet.ino。

错误码速查表

所有客户端调用返回事务 ID,结果通过事务回调以ResultCode形式通知,常见值:

错误码含义排查建议
0x00成功
0x01功能码不支持检查从站是否实现该功能
0x02地址非法确认已addXxx注册该寄存器
0x03值超范围检查写入值
0xE4超时RTU:查接线/波特率(可降到 9600)/换独立供电;TCP:ping 与防火墙排查
0xE5连接丢失检查对端在线状态
0xE6事务被取消

传输层设置:RTU 与 TCP 快速上手

需求RTU(串口/RS-485)TCP(网络)
初始化begin(&Serial1, txEnablePin)
设波特率setBaudrate(9600)(非 ESP 平台必调)
从站模式server(slaveId)server(port),默认 502
主站模式client()(或master()client(),配合connect(ip, port)
自动重连autoConnect(true),默认关闭

RTU 的begin支持SoftwareSerial/HardwareSerial/任意StreamtxEnablePin用于 MAX-485 收发控制(低电平有效需传txEnableDirect=false)。RTU 接口签名见 src/ModbusRTU.h,编译期配置项(最大寄存器数、事务数等)在 src/ModbusSettings.h 中调整。

常见问题速答

  • float / 32 位值怎么发?拆成多个 16 位寄存器,连续 read/write 后在应用层拼合。
  • 0xE4 超时偶发?偶发可接受;频发则按上表 RTU/TCP 分别排查硬件与网络。
  • 能做 TCP→RTU 桥吗?可以,参考 examples/Bridge/TCP-to-RTU-Simulator/ 及文档 documentation/README.md 中的 FAQ。

把这张速查表收藏起来,配合examples/目录里的分场景示例(RTU、TCP、TLS、桥接、OTA 文件更新),就能覆盖绝大多数 Modbus 开发需求 ✅

【免费下载链接】modbus-esp8266Most complete Modbus library for Arduino. A library that allows your Arduino board to communicate via Modbus protocol, acting as a master, slave or both. Supports network transport (Modbus TCP) and Serial line/RS-485 (Modbus RTU). Supports Modbus TCP Security for ESP8266/ESP32.项目地址: https://gitcode.com/gh_mirrors/mo/modbus-esp8266

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 6:57:15

小白程序员必看:AI大模型应用入门指南,轻松掌握价值变现的终极环节

本文深入浅出地解析了AI应用层作为AI全栈产业的价值变现与终端落地环节,重点介绍了大模型、计算机视觉、语音识别等技术在AI办公、医疗、工业等领域的实际应用。文章详细阐述了AI应用层的核心竞争力在于场景理解、数据积累和商业化能力,并细分了To C、To…

作者头像 李华
网站建设 2026/9/2 8:07:36

190行C代码读懂整个哈希表:map源码逐行精读,初学者也能上手

190行C代码读懂整个哈希表:map源码逐行精读,初学者也能上手 【免费下载链接】map A type-safe hash map implementation for C 项目地址: https://gitcode.com/gh_mirrors/map1/map 想彻底搞懂哈希表的实现原理吗?map 是一个专为 C 语…

作者头像 李华
网站建设 2026/9/3 4:17:59

AI编码代理的“氛围税”:效率幻觉背后的隐性成本与量化审计

打开任何一个 AI 编码代理的官方页面,你大概率会看到同样的关键词:10 倍效率、自动完成、智能修复。真正上手后,很多开发者也确实会给出“回不去了”的评价。但如果你愿意把维度拉长——不是看第一周的兴奋感,而是看一个完整迭代周…

作者头像 李华
网站建设 2026/9/5 6:53:34

Buzz:免费离线语音转文字工具,Whisper 转录全程本地完成

Buzz:免费离线语音转文字工具,Whisper 转录全程本地完成 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz …

作者头像 李华
网站建设 2026/9/2 10:49:56

测试时扩展与推理大模型评测:可复现性工程实践

最近在对比推理大模型(reasoning LLM)的不同评测方式时,被一个很现实的问题卡住:模型效果波动不小,同一个 prompt 跑两次,答案可能完全不同;换一个推理采样配置,分数能差好几个点。如…

作者头像 李华