You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

4.0 KiB

Modbus 掉电保持与私有功能码重映射设计

目标

保留并完善以下附加功能:

  • 固定寄存器 0x00010000 的读取、写入与掉电保持验证。
  • 奇数数量的连续保持寄存器批量读取。
  • TouchWin 读取结果的本地清除。

通信历史功能及其界面展示不再保留。

私有功能码

下列功能码仅用于本训练项目的 TouchWin 与 STM32 Modbus RTU 从站,
不是 Modbus 国标功能码。

功能码 功能 请求 PDU(CRC 前) 正常响应 PDU(CRC 前)
0x41 读取 0x00010000 41 00 01 00 00 00 01 41 02 <value_hi> <value_lo>
0x42 写入 0x00010000 42 00 01 00 00 <value_hi> <value_lo> 回显请求 PDU
0x43 读取奇数数量的连续保持寄存器 43 <start_hi> <start_lo> <count_hi> <count_lo> 43 <byte_count> <data...>

请求和响应帧均以前置从站地址、后置 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 个数值显示组件,每个组件依次绑定
PSW372PSW494。也可以只显示前 8 或前 16 个组件用于演示,响应仍会完整
写入 123 个 PSW,未显示的 WORD 可在监控页查看。

删除范围

  • 删除 0x43 通信历史的协议常量、历史记录结构体、从站状态字段、响应构造函数
    ModbusRecordHistory() 公共接口。
  • 删除主程序中历史结果码转换和所有记录调用。
  • 删除 PSW500..PSW509、通信历史按钮及画面说明。
  • 旧的 0x42 奇数数量读取改为 0x43;原 0x43 历史请求不再受支持。

验证

  • 0x41 读取固定地址的值、非法地址和非法数量。
  • 0x42 写入后回显,非法扩展地址拒绝,写入成功触发备份保存。
  • 0x43 覆盖最小值 1、最大值 123、偶数数量、越界地址和错误 CRC。
  • 清除仅写 PSW350,不产生 Modbus 请求;写入、清除、断电恢复、读取后数值一致。