VisualHMI RW 掉电存储区:Flash 寿命、扇区落盘顺序与安全初始化

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

RW 区是 HMI 的掉电保存寄存器:주소 0x0000~0x7FFF 共 64KB(32768×2 바이트),基于 Flash 存储,上电默认值 0xFFFF。파라미터、配方、运行状态这类「断电不能丢」的数据放这里。但它有寿命和坑,用不好会毁固件。

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

推荐「同扇区标志 + 参数边界检查」双重策略:魔数确认初始化过,边界检查防脏数据。

三个铁律:①严禁高频实时数据存 RW——曲线、计数、实时值放 LW,只有掉电要留的参数才进 RW;②写前先判断值是否变化,没变就别写,10 万次寿命经不起周期刷;③上电必须做初始化检查,用 0x55AA 魔数 + 边界校验,否则首次上电读到 0xFFFF 全乱。

整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA Tutorial「RW存储」,版权归大彩科技所有。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC 검증 and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email 주소 will not be published. Required fields are marked *.