VisualHMI - 定时器
VisualHMI的Lua脚本支持32个定时器(软件定时器),索引从0~31。当开启的定时器,当32位计数器超时溢出后,触发定时器回调,在回调函数里面执行相应操作。
本章节,演示定时器倒计时显示,并在定时完成后,下发指令给PLC设备;
适用范围:VisualHMI - HMI&M系列&Dx系列
例程下载链接:ViusalHMI - 定时器(点击下载)
1.定时器
1.1.start_timer(timer_id, timeout, countdown, repeat)
启动脚本定时器函数,start_timer 是 HMI 系统提供软件定时器。当定时器超时后,系统将自动调用全局回调函数 on_timer(timer_id),从而实现周期性任务、延时操作、状态轮询等逻辑。
⚠️ 注意:此定时器为应用层软件定时器,精度受系统负载影响,不适用于硬实时控制。
📊 参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
timer_id |
number | 定时器 ID • 取值范围:0 ~ 31(共 32 个独立定时器) |
timeout |
number | 超时时间(毫秒) • 最小值通常为 10~20ms左右(依平台而定) |
countdown |
number | 计时模式 • 0:顺计时(从 0 开始累加,超时即触发) • 1:倒计时(从 timeout 倒数至 0 触发)注:对 on_timer 回调行为无影响,仅影响内部显示或调试用途 |
repeat |
number | 重复次数 • 0:无限重复(周期性触发) • N > 0:触发 N 次后自动停止 |
1.2.stop_timer(timer_id)
停止脚本定时器函数,stop_timer(timer_id) 是 HMI 系统提供的定时器管理接口,用于立即停止指定 ID 的软件定时器,防止其继续触发 on_timer 回调。
📊 参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
timer_id |
number | 定时器 ID • 取值范围:0 ~ 31 • 必须与之前通过 start_timer 启动的定时器 ID 一致 |
1.3.on_timer(timer_id)
定时器超时回调函数,on_timer(timer_id) 是 HMI 系统中定时器事件的统一回调入口。当通过 start_timer 启动的任意定时器超时时,系统会自动调用此函数,并传入对应的 timer_id,开发者可据此执行对于逻辑。
📊 参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
timer_id |
number | 触发超时的定时器 ID • 取值范围:0 ~ 31 • 用于区分多个并发定时器 |
💡 示例
如初始化开启1s超时,无限循环的定时器,则每秒输出“hello lua”
function on_timer(timer_id)
if timer_id == 0
then
print('hello lua!!!')
end
end
function on_init()
start_timer(0, 1000, 0, 0)
end
>hello lua!!!
>hello lua!!!
>...
1.4.get_timer_value(timer_id)
获取定时器当前计时值函数,get_timer_value(timer_id) 是 HMI 系统提供的定时器状态查询接口,用于实时获取指定软件定时器的当前计时值(单位:毫秒)。该函数支持顺计时和倒计时两种模式下的读取
📊 参数说明
| 项目 | 说明 |
|---|---|
| 参数 | |
timer_id |
定时器 ID • 取值范围:0 ~ 31 • 必须对应一个已启动的定时器 |
| 返回值 | |
time_ms |
当前计时值(毫秒) |
2. 画面配置
2.1.定时器开关
添加一个位状态指示灯,关联LW1002寄存器,用于控制定时器的开启、关闭;
- 读取地址:LW1002
- 开关类型:切换开关
- 切换开关:√
- 使用图库:√
- 使用文字:√

添加两个滚轮控件,分别关联LW1000、LW1001寄存器,用于定时的时间设置,以“时”控件为例;
- 监视地址:LW1000
- 总项数:24
- 候选项:3
- 惯性:√
- 候选内容:0;1;2;3;4;5;6;7;8;9;10;...21;22;23;
- 控件权限:LW1002

添加一个文本控件关联LW1010寄存器,用于显示倒计时
- 读取地址:LW1010

3. Lua 脚本
点击位状态指示灯,当值等于1时候,触发定时器开启;值为0时候,关闭定时器。同时,获取倒计时的时间,并复位相关变量和控件值,代码如下所示
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1002
then
local val = get_uint16(vtype,addr)
local hour = get_uint16(vtype,0x1000)
local minu = get_uint16(vtype,0x1001)
_TIMER_REPEAT_ = hour*60*60 + minu*60 --计算倒计时,单位s
set_notify(0) --设置倒计时,不发出指令通知
set_string(VT_LW, 0x1010, string.format('%02d', (_TIMER_REPEAT_ // (60*60))) ..':'..
string.format('%02d', ((_TIMER_REPEAT_ // (60)) % 60)) ..':'.. string.format('%02d', (_TIMER_REPEAT_ % 60)))
if val == 1
then
if _TIMER_REPEAT_ > 0 --倒计时大于1才执行
then
_TIMER_CNT_ = 0
stop_timer(0)
start_timer(0, 1000, 0, _TIMER_REPEAT_)
end
else
stop_timer(0)
end
end
end
end
定时器每秒回调触发on_timer(...),一共触发TIMER_REPEAT次,累计回调的次数TIMER_CNT,并计算出剩余的次数;当TIMER_CNT和TIMER_REPEAT相等时,表示定时结束,发送指令到PLC设备,代码如下所示
function on_timer(timer_id)
if timer_id == 0
then
_TIMER_CNT_ = _TIMER_CNT_ + 1--累计回调次数
local remaining = _TIMER_REPEAT_ - _TIMER_CNT_ --剩余次数
set_notify(0)
set_string(VT_LW, 0x1010, string.format('%02d', (remaining // (60*60))) ..':'..
string.format('%02d', ((remaining // (60)) % 60)) ..':'.. string.format('%02d', (remaining % 60))) --显示倒计时
if _TIMER_CNT_ == _TIMER_REPEAT_
then
set_uint16(VT_LW, 0x1002, 0x00)--复位定时器按钮
set_notify(1)
set_uint16(VT_LW, 0x1003, 0x01)--发指令通知主板
end
end
end
4. 运行预览
运行虚拟屏,设置定时器60秒,显示倒计时,定时结束后,发送指令给PLC,如下所示
