# Modbus 掉电保持与私有功能码重映射设计 ## 目标 保留并完善以下附加功能: - 固定寄存器 `0x00010000` 的读取、写入与掉电保持验证。 - 奇数数量的连续保持寄存器批量读取。 - TouchWin 读取结果的本地清除。 通信历史功能及其界面展示不再保留。 ## 私有功能码 下列功能码仅用于本训练项目的 TouchWin 与 STM32 Modbus RTU 从站, 不是 Modbus 国标功能码。 | 功能码 | 功能 | 请求 PDU(CRC 前) | 正常响应 PDU(CRC 前) | | --- | --- | --- | --- | | `0x41` | 读取 `0x00010000` | `41 00 01 00 00 00 01` | `41 02 ` | | `0x42` | 写入 `0x00010000` | `42 00 01 00 00 ` | 回显请求 PDU | | `0x43` | 读取奇数数量的连续保持寄存器 | `43 ` | `43 ` | 请求和响应帧均以前置从站地址、后置 Modbus CRC16(低字节在前)。 ### `0x41` 读取规则 - 32 位地址必须为 `0x00010000`,数量必须为 `1`。 - 正常响应返回一个 16 位寄存器值。 - 任何其他地址返回异常码 `0x02`;数量错误返回异常码 `0x03`。 ### `0x42` 写入规则 - 32 位地址必须为 `0x00010000`。 - 写入值为一个 16 位 WORD。 - 正常响应完整回显地址和值,便于 TouchWin 确认从站接受的实际数据。 - 每次 `0x42` 写入成功后,由主程序调用 RTC 备份保存;重启时恢复该值。 - `0x42` 不使用数量字段,帧长度固定为 10 字节(含 CRC)。 ### `0x43` 奇数数量读取规则 - 起始地址范围为 `0x0000..0x270F`。 - 数量范围为 `1..123`,且必须是奇数。 - 读取地址是连续地址,不是隔一个地址读取;例如起始 `0`、数量 `123` 返回地址 `0..122`。 - 数量为偶数或大于 `123` 返回异常码 `0x03`;读取越过 `0x270F` 返回异常码 `0x02`。 ## 数据保持与清除 MCU 的 RTC 备份寄存器保存保持寄存器 `0..31`、线圈 `0..15` 和 固定寄存器 `0x00010000`。保存发生在标准写功能码和私有写功能码 `0x42` 成功后;上电启动时 CRC 校验通过才恢复。该功能依赖硬件 VBAT 已接入,不能声明为完整 10000 个寄存器掉电保持。 TouchWin 的“清除”只将本地显示用 `PSW350` 写为 `0`: - 不发送 Modbus 帧。 - 不改写 PLC 的 `0x00010000`。 - 不触发 RTC 备份保存。 因此操作顺序为:写入一个值、清除 `PSW350`、PLC 断电再上电、读取; 读回相同值即验证掉电保持。 ## TouchWin PSW 分配 | 用途 | PSW | 说明 | | --- | --- | --- | | 状态码 / 实际接收长度 | `PSW319` / `PSW320` | 所有私有功能共用。 | | `0x41` 读取结果 | `PSW350` | 清除按钮仅清除此显示值。 | | `0x42` 写入值 | `PSW351` | 供写入按钮读取。 | | `0x43` 起始地址 / 数量 | `PSW370` / `PSW371` | 数量限制为 `1..123` 的奇数。 | | `0x43` 结果 | `PSW372..PSW494` | 共 `494 - 372 + 1 = 123` 个 WORD。 | 若画面要显示全部批量读取结果,需要 123 个数值显示组件,每个组件依次绑定 `PSW372` 至 `PSW494`。也可以只显示前 8 或前 16 个组件用于演示,响应仍会完整 写入 123 个 PSW,未显示的 WORD 可在监控页查看。 ## 删除范围 - 删除 `0x43` 通信历史的协议常量、历史记录结构体、从站状态字段、响应构造函数 和 `ModbusRecordHistory()` 公共接口。 - 删除主程序中历史结果码转换和所有记录调用。 - 删除 `PSW500..PSW509`、通信历史按钮及画面说明。 - 旧的 `0x42` 奇数数量读取改为 `0x43`;原 `0x43` 历史请求不再受支持。 ## 验证 - `0x41` 读取固定地址的值、非法地址和非法数量。 - `0x42` 写入后回显,非法扩展地址拒绝,写入成功触发备份保存。 - `0x43` 覆盖最小值 `1`、最大值 `123`、偶数数量、越界地址和错误 CRC。 - 清除仅写 `PSW350`,不产生 Modbus 请求;写入、清除、断电恢复、读取后数值一致。