远程维护链路

远程维护走的是透传链路,不需要设备连网,也不需要云端参与:

远端调试工具 ──G780S网络透传──▶ USART3 ──Modbus RTU──▶ STM32 (地址 0x0A)

G780S 只负责网络透传,不解释 Modbus 帧内容。STM32 作为 Modbus RTU 从站,暴露三组寄存器区域:现场数据区、远程配置区、维护控制区。

设计理念:暂存-提交模型

远程修改参数不直接写入 Flash,而是采用”暂存-提交”模型:

解锁 → 写暂存 → 提交保存 → Flash 持久化

这一设计的核心价值:

  • 防误操作:修改必须显式提交才生效,中间可以随时放弃
  • 原子性:所有参数在提交时一次性校验,要么全生效,要么全拒绝
  • 可追溯:配置序号递增,诊断区可查最近一次保存的快照

解锁机制

口令

向寄存器 0x0030 写入 0xA55A

0A 06 00 30 A5 5A 73 D5

30 秒维护窗口

解锁后获得 30 秒的维护窗口。窗口内可以自由读写配置区,超时后自动上锁。通过 0x0037 可查询剩余时间。

状态反馈

读取 0x0032 查看当前维护状态,bit0 表示是否已解锁:

0A 03 00 32 00 06 65 7C

返回示例(0x000D = 0000 1101b):

  • bit0 = 1:已解锁
  • bit2 = 1:配置来自 Flash 加载
  • bit3 = 1:最近一次保存成功

配置寄存器区

配置区占用 0x0020 ~ 0x0028,共 9 个寄存器:

地址名称类型默认值说明
0x0020传感器采集周期uint16, ms2000现场传感器轮询间隔
0x0021流量采样周期uint16, ms1000流量换算计算节拍
0x0022DI 去抖时间uint16, ms50继电器输入去抖
0x0023温度变化阈值uint16, ×10℃10触发上报的最小温差
0x0024~25每升脉冲数uint32, ×10066000流量计校准系数
0x0026~27Hz/LPM 换算系数uint32, ×1001100频率→流量换算
0x0028控制模式uint1600=手动, 1=自动

读取配置区

0A 03 00 20 00 09 85 7D

返回示例解析:

0x0020 = 0x2710 = 10000ms
0x0021 = 0x03E8 = 1000ms
0x0022 = 0x0032 = 50ms
0x0023 = 0x000A = 1.0℃
0x0024~25 = 0x000101D0 = 66000 = 660.00 脉冲/升
0x0026~27 = 0x0000044C = 1100 = 11.00 Hz/LPM
0x0028 = 0x0000 = 手动模式

参数校验规则

单参数范围校验

参数有效范围
传感器采集周期200 ~ 60000 ms
流量采样周期100 ~ 10000 ms
DI 去抖时间10 ~ 5000 ms
温度变化阈值1 ~ 500(即 0.1℃ ~ 50.0℃)
每升脉冲数100 ~ 10000000
Hz/LPM10 ~ 1000000
控制模式只能为 0 或 1

16 位参数在单寄存器写入时直接做范围拦截,32 位参数(拆成高低寄存器写入)在提交保存时统一校验。

组合约束

提交时会额外检查两个组合关系:

  • flow_sample_period_ms <= sensor_period_ms:流量采样不能比传感器采集还慢
  • di_debounce_ms < sensor_period_ms:去抖时间必须小于采集周期

违反约束会返回 G780S_ERR_CONFIG_CONFLICT(错误码 16)。

维护命令

0x0031 写入命令,共 5 种操作:

命令说明
0x0001APPLY_SAVE提交暂存值到 Flash 并生效
0x0002DISCARD_STAGED放弃暂存,恢复为当前生效配置
0x0003RESTORE_DEFAULTS恢复默认配置并保存
0x0004CLEAR_ERROR清除错误码
0x0005ENTER_BOOT_UPGRADE进入 Bootloader 升级模式

提交保存

0A 06 00 31 00 01 18 BE

执行后设备会:

  1. 对所有暂存参数做范围和组合校验
  2. 校验通过后写入 Flash 配置页
  3. 配置序号 +1
  4. 新配置立即生效

放弃暂存

0A 06 00 31 00 02 D8 7E

恢复为当前生效配置,不写 Flash。适合改了一半发现不对的场景。

恢复默认

0A 06 00 31 00 03 99 BF

擦除配置页,所有参数回到代码默认值。诊断区会记录配置来源为 1(默认配置)。

错误码体系

读取 0x0033 获取最近一次错误码:

错误码名称说明
0ERR_NONE无错误
1ERR_LOCKED未解锁,拒绝写入
2ERR_INVALID_UNLOCK_KEY解锁口令错误
3ERR_FLASH_ERASEFlash 擦除失败
4ERR_FLASH_PROGRAMFlash 编程失败
5ERR_FLASH_VERIFYFlash 回读校验失败
6ERR_BAD_COMMAND命令非法
7ERR_FLASH_EMPTYFlash 参数页为空,已回退默认值
8ERR_FLASH_CRC参数页 CRC/版本错误,已回退默认值
9ERR_SENSOR_PERIOD_RANGE传感器采集周期越界
10ERR_FLOW_SAMPLE_RANGE流量采样周期越界
11ERR_DI_DEBOUNCE_RANGEDI 去抖时间越界
12ERR_TEMP_THRESHOLD_RANGE温差触发阈值越界
13ERR_PPL_RANGE每升脉冲数越界
14ERR_HZ_PER_LPM_RANGEHz/LPM 换算参数越界
15ERR_CONTROL_MODE_INVALID控制模式非法
16ERR_CONFIG_CONFLICT参数组合关系不合法
17ERR_UPGRADE_REQUEST进入升级模式请求失败

典型操作流程

以”把采集周期从 2 秒改成 10 秒”为例:

第 1 步:解锁

0A 06 00 30 A5 5A 73 D5

第 2 步:写参数(0x0020 = 10000ms = 0x2710)

0A 06 00 20 27 10 93 47

第 3 步:提交保存

0A 06 00 31 00 01 18 BE

第 4 步:读状态确认

0A 03 00 32 00 06 65 7C

第 5 步:读配置区确认

0A 03 00 20 00 09 85 7D

异常帧解读

当写入被拒绝时,设备返回异常帧而不是回显:

异常帧模式含义
86 02地址非法(寄存器不存在)
86 03写入值非法或解锁口令错误
86 04维护命令执行失败
83 02读取地址非法

使用注意事项

  • 读取数据区、配置区、维护状态区、诊断区都不需要解锁
  • 只有写 0x0020~0x0028 配置区才需要先解锁
  • 每条 Modbus 帧发完、等返回后再发下一条,不要拼接
  • 如果执行了 ENTER_BOOT_UPGRADE,设备会立即复位进入 Bootloader,不再响应本文档中的维护命令
  • 配置修改后如果不提交保存,掉电重启会恢复为上次保存的值