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寄存器,用于控制定时器的开启、关闭;

  1. 读取地址:LW1002
    • 开关类型:切换开关
  2. 切换开关:√
  3. 使用图库:√
  4. 使用文字:√

image-20240117161938430

添加两个滚轮控件,分别关联LW1000、LW1001寄存器,用于定时的时间设置,以“时”控件为例;

  1. 监视地址:LW1000
  2. 总项数:24
  3. 候选项:3
  4. 惯性:√
  5. 候选内容:0;1;2;3;4;5;6;7;8;9;10;...21;22;23;
  6. 控件权限:LW1002

image-20240117162630772

添加一个文本控件关联LW1010寄存器,用于显示倒计时

  • 读取地址:LW1010

image-20240117163116972

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,如下所示

Video_2024-01-17_170730

Copyright ©Dacai all right reserved,powered by Gitbook该文件修订时间: 2026-02-05 13:48:16

results matching ""

    No results matching ""