本文目录
- 1. 1. API 总表
- 2. 2. 基础用法
- 3. 3. 应用:倒计时完成后给 PLC 发指令
VisualHMI 的 Lua 支持 32 个软件定时器(索引 0~31)。启动后超时触发 on_timer(timer_id) 回调,做周期性任务、延时操作、状态轮询。⚠️ 这是应用层软件定时器,精度受系统负载影响,不适用于硬实时控制。
1. API 总表
| 函数 | 参数 | 说明 |
|---|---|---|
start_timer(timer_id, timeout, countdown, repeat) |
timeout 毫秒(最小约 10~20ms);countdown 0=顺计时/1=倒计时;repeat 0=无限重复/N=触发 N 次后自动停 | 启动定时器 |
stop_timer(timer_id) |
定时器 ID | 立即停止 |
on_timer(timer_id) |
超时回调统一入口 | 用 timer_id 区分并发定时器 |
get_timer_value(timer_id) |
定时器 ID | 获取当前计时值(ms),支持顺/倒计时 |
countdown 参数只影响内部计时显示/调试,不改 on_timer 的触发行为——顺计时到 timeout 触发,倒计时从 timeout 减到 0 触发,回调都是同一个。
2. 基础用法
function on_init()
start_timer(0, 1000, 0, 0) -- 1秒周期,无限重复
start_timer(1, 5000, 1, 1) -- 5秒倒计时,只触发1次
end
function on_timer(timer_id)
if timer_id == 0 then
-- 每秒做一次:状态轮询
elseif timer_id == 1 then
-- 5秒后执行一次
end
end
3. 应用:倒计时完成后给 PLC 发指令
需求:设定时/分后倒计时,倒计时结束复位按钮并给主板发指令。控件布局:位状态指示灯 LW1002(切换开关)控制启停;滚轮控件 LW1000(时,0~23)、LW1001(分)设时长;文本控件 LW1010 显示倒计时。
_TIMER_REPEAT_ = 0 -- 总时长(秒)
_TIMER_CNT_ = 0 -- 已触发次数
function on_update(slave, vtype, addr)
if vtype == VT_LW and addr == 0x1002 then
if get_uint16(VT_LW, 0x1002) == 1 and _TIMER_REPEAT_ > 0 then
stop_timer(0)
start_timer(0, 1000, 0, _TIMER_REPEAT_) -- 每秒一次,共 repeat 次
else
stop_timer(0)
end
end
end
function on_timer(timer_id)
if timer_id == 0 then
_TIMER_CNT_ = _TIMER_CNT_ + 1
local remain = _TIMER_REPEAT_ - _TIMER_CNT_
-- 显示剩余时间 mm:ss
set_string(VT_LW, 0x1010,
string.format("%02d:%02d", math.floor(remain / 60), remain % 60))
if remain == 0 then
set_uint16(VT_LW, 0x1002, 0x00) -- 复位启停按钮
set_uint16(VT_LW, 0x1003, 0x01) -- 发指令给主板
end
end
end
要点:_TIMER_REPEAT_ 在用户设定时长时计算(hour*3600 + min*60);start_timer 的 repeat 传总次数,on_timer 每次累加 _TIMER_CNT_,相等即结束。set_notify(0/1) 控制定时器期间是否发出指令通知,需要下发时置 1。
三个坑:①软件定时器精度受系统负载影响,做硬实时控制会翻车;②timeout 最小约 10~20ms,别传 1ms 期望准;③repeat=N 触发 N 次后自动停,要无限循环传 0;多个定时器并发时用 timer_id 区分,on_timer 是统一入口。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「定时器」,版权归大彩科技所有。
发表回复