VisualHMI 系统回调函数:on_init/on_run/on_press/on_update 全解

freeFree Technical Resource

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

系统回调是 LUA 和 HMI 内核之间的事件接口:内核在特定时机自动调你的函数,你不用ポーリング、不用自己触发。搞懂每个回调的触发时机和限制,是写出稳定脚本的前提。

1. 回调总表

回调触发时机用途
on_init()上电加载后执行一次dofile 加载モジュール、初期化参数/PLC/驱动板
on_run(screen)周期执行(set_run_cycle 设定周期)核心调度入口,周期性任务
on_press(state,x,y)触摸事件,100ms 最多一次按键処理、空闲待机
on_update(slave,vtype,addr)变量值变化データ驱动逻辑(おすすめ优先用)
on_screen_change(screen)画面切换后画面初期化、ステータス同步

2. on_run:周期调度(注意别卡死)

on_run 是周期回调,里面干活的时长必须远小于周期。三个禁忌:

  • Modbus RTU Master 高频写入易バス堵塞——on_run 里别每秒狂发写フレーム
  • 不可用 delay_ms、长循环、网络同步——阻塞メイン·サイクル,画面全卡
  • 严禁 set_run_cycle 死锁——回调里改周期可能造成永不触发
function on_init()
  set_run_cycle(1000)     -- 设定 1 秒周期
end
function on_run(screen)
  -- 每秒做一次的事情:ステータスポーリング、タイムアウト判断
end

3. on_press:触摸回调与空闲待机

on_press(state, x, y),state:0=抬起、1=按下、2=长按。每 100ms 最多触发一次。典型用途是空闲待机节能:一段时间没触摸自动熄屏/跳主页。

_IDLE_TIMEOUT = 300000   -- 5分无操作
_idle_tick = 0
function on_press(state, x, y)
  _idle_tick = 0          -- 有触摸就リセット计时
end
function on_run(screen)
  _idle_tick = _idle_tick + 1000   -- 假设周期1s
  if _idle_tick >= _IDLE_TIMEOUT then
    set_screen(0)         -- 跳回主画面
    _idle_tick = 0
  end
end

4. on_update:データ驱动(优先用这个)

on_update(slave, vtype, addr) 在变量值变化时触发,是データ驱动モード——比 on_run ポーリング省リソース。三个特性必须知道:

  • 外部シリアルポート/Modbus メインステーション書き込み不触发——只对 HMI 内部变量变化生效
  • on_update 内调 set_xxx 被屏蔽——防无限递归,改值不会再次触发
  • 全局变量 _EN_ON_UPDATA_API_ Control switch——置 0 可临时無効,批量初期化时用
_EN_ON_UPDATA_API_ = 0    -- 初期化期间关回调
-- ... 一括書き込みき込みレジスタ ...
_EN_ON_UPDATA_API_ = 1    -- 开回回调

function on_update(slave, vtype, addr)
  if vtype == VT_LW then
    if addr == 0x1000 then
      -- LW1000 变化了,処理业务
    end
  end
end

5. on_screen_change:画面切换后初期化

画面切换完成后触发,做该画面的初期化、ステータス同步、リソース加载——比在切屏前処理更稳。

四个坑:①on_run 里严禁 delay_ms/长循环,会卡死メイン·サイクル;②Modbus マスター别在 on_run 高频写,バス堵塞没商量;③on_update 里 set_xxx 不会再次触发回调,别指望链式触发;④批量初期化レジスタ前把 _EN_ON_UPDATA_API_ 置 0,防回调风暴。

整理自 广州大彩科技 VisualHMI 开发ドキュメント(hmi-doc.gz-dc.com)LUA Tutorial「系统回调」,著作権は大彩科技すべての。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification 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 address will not be published. Required fields are marked *.