RW 区是 HMI 的掉电保存寄存器:地址 0x0000~0x7FFF 共 64KB(32768×2 字节),基于 Flash 存储,上电默认值 0xFFFF。参数、配方、运行状态这类「断电不能丢」的数据放这里。但它有寿命和坑,用不好会毁固件。
1. RW 区特性
| 项目 | 值 |
|---|---|
| 地址范围 | 0x0000 ~ 0x7FFF(32768 字) |
| 存储介质 | Flash(掉电保存) |
| 默认值 | 0xFFFF |
| Flash 寿命 | 约 10 万次擦写 |
| 写入机制 | 内部 4KB 写缓存队列,约每 400 次写入触发一次擦写 |
2. ⚠️ 致命风险:过度擦写会毁固件
RW 区和固件区物理相邻。反复擦写 RW 如果扩散到固件区,设备直接损坏:黑屏、no firmware 蓝屏。这是硬伤,不是吓唬人。
另外 Flash 按扇区顺序落盘(低地址先写),跨扇区的标志位有一致性风险——一个标志的两个字节落在不同扇区,写一半断电可能半新半旧。
3. 正确使用姿势
- 地址连续分配:参数集中放一段,别到处撒
- set_array 批量写:一次写一组,别一个一个 set
- 控制写入频率:只有值变化才写,别周期刷
- 标志位放同扇区:需要原子性的标志放一起
- 启动做边界值检查:上电读 RW 校验合法性(0x55AA 魔数)
function on_init()
-- 上电检查 RW 是否已初始化(魔数 0x55AA)
if get_uint16(VT_RW, 0x2000) ~= 0x55AA then
-- 首次上电,写入默认参数
set_uint16(VT_RW, 0x2000, 0x55AA) -- 魔数
set_uint16(VT_RW, 0x2001, 50) -- 温度上限默认值
set_uint16(VT_RW, 0x2002, 4800) -- 波特率默认值
else
-- 已初始化,检查参数边界
local t = get_uint16(VT_RW, 0x2001)
if t 100 then
set_uint16(VT_RW, 0x2001, 50) -- 越界恢复默认
end
end
end
推荐「同扇区标志 + 参数边界检查」双重策略:魔数确认初始化过,边界检查防脏数据。
三个铁律:①严禁高频实时数据存 RW——曲线、计数、实时值放 LW,只有掉电要留的参数才进 RW;②写前先判断值是否变化,没变就别写,10 万次寿命经不起周期刷;③上电必须做初始化检查,用 0x55AA 魔数 + 边界校验,否则首次上电读到 0xFFFF 全乱。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「RW存储」,版权归大彩科技所有。
发表回复