Modbus 0x0F 写 10 路输出,数量、字节数和尾位怎样一起验

2026-10-24

0x0F(十进制 15)写十路线圈需要两个负载字节,末字节只有低两位有效。数量、byte count、实际负载长度和正常应答中的地址数量应分别检查,少一项都可能让写入范围与意图不一致。

适用版本与输入范围

依据 Modbus Application Protocol V1.1b3(2012-04-26),按下方具体功能章节解释PDU。输入已经剥离RTU地址、CRC或TCP封装,不把封装检查与数据字段解析混为一体。 本文所有输入均为原创合成数据,未接真实设备。

从写入范围推导负载大小

附件请求 0F 00 20 00 0A 02 55 01 表示从协议地址 32 起连续写十路。000A 是线圈数量,02 是数据字节数,两者不是可互换字段。计算方式为向上取整 10/8,结果为两字节;第一字节放前八路,第二字节放剩下两路。每个功能都有独立数量限制,此处校验 1 到 1968,不能直接复制读线圈功能允许的上限。

写请求的尾填充也应固定

55 的低位先展开成开关交替,01 只有最低位为一,所以最后两路依次为开、关。第二字节高六位属于填充范围。程序把 81 作为显式负例,尽管它仍能解出同样十路有效状态,额外高位不符合所声明的规范编码,应在发送前拒绝。写路径尤其不适合静默容错,因为接收器差异可能把原本被忽略的数据变成新的调试隐患。

应答只回显写入范围

正常响应为 0F 00 20 00 0A,不会把 55 01 再回传一遍。核验脚本对照请求的前五字节,确认功能码、起始地址和数量完全一致。若误把响应的 000A 当成状态负载,日志会产生并不存在的十路反馈。范围回显能确认协议应答对应哪些线圈,不能证明每一路负载输出已经改变;需要真实反馈的业务仍要另读独立状态。

将错误定位到具体约束

附件第二条负例保持数量十路,却将 byte count 写成一并只留一个数据字节,程序报负载长度错误。第三条长度一致而尾位有问题,报尾填充位非零。这样测试可以分别覆盖数量计算和位图编码,不用等设备报一个笼统异常才反推原因。实际设备还可能只允许较小的连续写范围,应把设备限制叠加在规范上限之内,并按厂商点表确认此范围允许写入。

下载与复跑

将输入 fixture.json与独立程序 verify.py放在同一目录,用 Python 3.12 执行 python verify.py,无需安装第三方包。程序从自身目录读取输入并写入 report.json,不要求当前终端恰好位于下载目录。也可查看本次实跑报告和复跑说明。

本次实际运行通过 3 条输入断言,包括标有“显式负例”的记录;负例以JSON字段承载,不会把下载文件本身做成损坏编码。states 是请求内的写入意图;quantity和address对应应答回显范围,不是现场回读值。 修改输入后应同时审查期望结果,不能只改断言数字让测试变绿。

对象或字段的基础关系可回到Modbus 寄存器映射基础核对,更多接口入口在设备协议库。若需要把已确认的数据点接入展项编排,可了解SoftControl 展厅中控;具体接入能力以项目确认和实际测试为准。

一级依据

来源核对日期:2026-10-24。离线结果只证明给定输入的解析或计算行为;现场兼容性、响应时间、硬件准确度和具体产品支持均未测量。

需要展厅软硬件方案或定制开发?

加微信,把这一页发到你手机上

扫码加站长企业微信,会自动把这一页的链接发给你。问软件授权、报价,或者现场遇到问题,也可以直接聊。

去留微信

留言讨论

评论发布后会被人工复核,违规内容将被删除。

    还没有人评论,来说说你的看法

    如果发表没有反应,可以前往联系我们告诉我们。

    这个页面有问题?

    提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。