Modbus 0x16 掩码写寄存器,怎样算出哪些位会被保留

2026-10-24

0x16(十进制 22)掩码写的公式是结果 =(当前值 AND AND_Mask)OR(OR_Mask AND NOT AND_Mask)。AND_Mask 中为一的位保留原值,为零的位才由 OR_Mask 决定;OR_Mask 不能覆盖保留位。

适用版本与输入范围

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

先给两张掩码分配职责

把一个寄存器想成十六条独立通道:AND_Mask=1 的位置选择旧值,AND_Mask=0 的位置选择 OR_Mask。这样比只记“先与后或”更准确,因为公式中的 OR_Mask 还要经过反向掩码筛选。附件 current=0x1234、AND=0xFFF0、OR=0x0005,只改低四位,结果是 0x1235。高十二位 0x123 完整保留,不需要调用方先改写整字再发送。

用反例识别错误简化公式

最容易写错的是 result=(current & and_mask) | or_mask。若 current=0、AND=FFFF、OR=FFFF,这个错误式会得到 FFFF,规范公式却应保持 0000,因为全部位都被要求保留。附件将这个组合列为正常计算案例,明确展示两张掩码的作用顺序。它不是非法编码,而是专门揭露算法误解的反例;程序仍应接受输入并给出确定结果,不能仅测试常见的低位修改组合。

让按位取反留在十六位范围

Python 的整数没有固定宽度,直接 ~and_mask 会产生负数。示例先与 FFFF 相与得到十六位 controlled_mask,再计算新值。所有三个输入都先检查为真正整数且位于 0 到 65535,超宽掩码不允许静默截断。这样日志中的 preserved_mask 和 controlled_mask 可以互补核对,测试人员能看清每一位是继承旧值还是由新掩码控制。

把算法结果与通信效果分开

这里的 current 是夹具明确提供的合成当前值,离线程序没有向寄存器写任何数据。实际使用仍需确认设备支持功能码十进制 22、目标地址允许掩码写,以及寄存器各位的业务含义。普通批量写寄存器是 0x10,也就是十进制 16,两者名称很容易混淆,日志最好同时写十六进制和十进制。掩码写只定义位更新关系,不自动证明某个设备输出已经达到期望状态。

下载与复跑

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

本次实际运行通过 4 条输入断言,包括标有“显式负例”的记录;负例以JSON字段承载,不会把下载文件本身做成损坏编码。result是合成当前值下的计算结果;preserved_mask与controlled_mask分别标识旧值和新值控制范围。 修改输入后应同时审查期望结果,不能只改断言数字让测试变绿。

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

一级依据

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

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

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

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

去留微信

留言讨论

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

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

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

    这个页面有问题?

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