RW 区是 HMI 的掉电保存レジスタ:address 0x0000~0x7FFF 共 64KB(32768×2 bytes),基于 Flash 存储,上电デフォルト値 0xFFFF。parameter、配方、実行状態の状態这类「停電不能丢」的データ放这里。但它有寿命和坑,用不好会毁固件。
1. RW 区特性
| 项目 | Value |
|---|---|
| アドレス範囲 | 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おすすめ「同扇区标志 + 参数边界チェック」双重策略:魔数確認初期化过,边界チェック防脏データ。
整理自 广州大彩科技 VisualHMI 开发ドキュメント(hmi-doc.gz-dc.com)LUA Tutorial「RW存储」,著作権は大彩科技すべての。
Leave a Reply