内容目录
本文目录
- 1. 1. API
- 2. 2. 倒计时案例(完整)
VisualHMI 提供 32 个软件定时器(索引 0~31),配合 on_timer 回调实现延时、周期、倒计时逻辑。注意:软件定时器精度受系统负载影响,不适合硬实时控制。
1. API
| 函数 | 说明 |
|---|---|
| start_timer(timer_id, timeout, countdown, repeat) | 启动定时器:timeout 单位 ms(最小约 10~20ms);countdown 0=顺计时/1=倒计时(只影响显示调试,不改变 on_timer 行为);repeat 0=无限重复/N=触发 N 次后自动停止 |
| stop_timer(timer_id) | 立即停止指定定时器 |
| on_timer(timer_id) | 超时统一回调,用 timer_id 区分并发定时器 |
| get_timer_value(timer_id) | 获取当前计时值(ms),支持顺/倒计时 |

2. 倒计时案例(完整)
场景:设定时长(小时+分钟),按启动键开始倒计时,剩余时间显示,到 0 自动复位并发指令给主板。
画面配置:位状态指示灯 LW1002(切换开关)控制启停;滚轮控件 LW1000(时,24 项候选 0~23)、LW1001(分)设时长;文本控件 LW1010 显示倒计时。
LUA:
_TIMER_REPEAT_ = 0 -- 总秒数
_TIMER_CNT_ = 0 -- 已计秒数
function on_update(slave, vtype, addr)
if vtype == VT_LW then
if addr == 0x1002 then
local sw = get_uint16(VT_LW, 0x1002)
local hour = get_uint16(VT_LW, 0x1000)
local minu = get_uint16(VT_LW, 0x1001)
if sw == 1 and _TIMER_REPEAT_ > 0 then
_TIMER_REPEAT_ = hour*3600 + minu*60
stop_timer(0)
start_timer(0, 1000, 0, _TIMER_REPEAT_) -- 每秒触发, 共repeat次
else
stop_timer(0)
_TIMER_REPEAT_ = hour*3600 + minu*60
end
end
end
end
function on_timer(timer_id)
if timer_id == 0 then
_TIMER_CNT_ = _TIMER_CNT_ + 1
local remain = _TIMER_REPEAT_ - _TIMER_CNT_
local h = math.floor(remain/3600)
local m = math.floor((remain%3600)/60)
local s = remain%60
set_string(VT_LW, 0x1010, string.format("%02d:%02d:%02d", h, m, s))
if remain <= 0 then
stop_timer(0)
set_uint16(VT_LW, 0x1002, 0x00) -- 复位按钮
set_uint16(VT_LW, 0x1003, 0x01) -- 发指令给主板
end
end
end

定时器三坑:①timeout 最小 10~20ms,设 1ms 不会更准;②countdown 参数只影响 get_timer_value 的显示方向,on_timer 触发逻辑一样;③软件定时器受系统负载影响,要做精确时序(如电机控制)别指望它。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「定时器」,版权归大彩科技所有。
发表回复