远程维护链路
远程维护走的是透传链路,不需要设备连网,也不需要云端参与:
远端调试工具 ──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, ms | 2000 | 现场传感器轮询间隔 |
0x0021 | 流量采样周期 | uint16, ms | 1000 | 流量换算计算节拍 |
0x0022 | DI 去抖时间 | uint16, ms | 50 | 继电器输入去抖 |
0x0023 | 温度变化阈值 | uint16, ×10℃ | 10 | 触发上报的最小温差 |
0x0024~25 | 每升脉冲数 | uint32, ×100 | 66000 | 流量计校准系数 |
0x0026~27 | Hz/LPM 换算系数 | uint32, ×100 | 1100 | 频率→流量换算 |
0x0028 | 控制模式 | uint16 | 0 | 0=手动, 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/LPM | 10 ~ 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 种操作:
| 值 | 命令 | 说明 |
|---|---|---|
0x0001 | APPLY_SAVE | 提交暂存值到 Flash 并生效 |
0x0002 | DISCARD_STAGED | 放弃暂存,恢复为当前生效配置 |
0x0003 | RESTORE_DEFAULTS | 恢复默认配置并保存 |
0x0004 | CLEAR_ERROR | 清除错误码 |
0x0005 | ENTER_BOOT_UPGRADE | 进入 Bootloader 升级模式 |
提交保存
0A 06 00 31 00 01 18 BE
执行后设备会:
- 对所有暂存参数做范围和组合校验
- 校验通过后写入 Flash 配置页
- 配置序号 +1
- 新配置立即生效
放弃暂存
0A 06 00 31 00 02 D8 7E
恢复为当前生效配置,不写 Flash。适合改了一半发现不对的场景。
恢复默认
0A 06 00 31 00 03 99 BF
擦除配置页,所有参数回到代码默认值。诊断区会记录配置来源为 1(默认配置)。
错误码体系
读取 0x0033 获取最近一次错误码:
| 错误码 | 名称 | 说明 |
|---|---|---|
0 | ERR_NONE | 无错误 |
1 | ERR_LOCKED | 未解锁,拒绝写入 |
2 | ERR_INVALID_UNLOCK_KEY | 解锁口令错误 |
3 | ERR_FLASH_ERASE | Flash 擦除失败 |
4 | ERR_FLASH_PROGRAM | Flash 编程失败 |
5 | ERR_FLASH_VERIFY | Flash 回读校验失败 |
6 | ERR_BAD_COMMAND | 命令非法 |
7 | ERR_FLASH_EMPTY | Flash 参数页为空,已回退默认值 |
8 | ERR_FLASH_CRC | 参数页 CRC/版本错误,已回退默认值 |
9 | ERR_SENSOR_PERIOD_RANGE | 传感器采集周期越界 |
10 | ERR_FLOW_SAMPLE_RANGE | 流量采样周期越界 |
11 | ERR_DI_DEBOUNCE_RANGE | DI 去抖时间越界 |
12 | ERR_TEMP_THRESHOLD_RANGE | 温差触发阈值越界 |
13 | ERR_PPL_RANGE | 每升脉冲数越界 |
14 | ERR_HZ_PER_LPM_RANGE | Hz/LPM 换算参数越界 |
15 | ERR_CONTROL_MODE_INVALID | 控制模式非法 |
16 | ERR_CONFIG_CONFLICT | 参数组合关系不合法 |
17 | ERR_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,不再响应本文档中的维护命令 - 配置修改后如果不提交保存,掉电重启会恢复为上次保存的值