You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CODESYS是否有类似Arduino millis()的定时器函数或变量?若无该如何创建?

CODESYS中替代Arduino millis()的方案:内置函数与自定义定时器

嘿,这个问题问得太实用了!很多从Arduino转CODESYS的朋友都会纠结这个点——毕竟millis()那种“随用随取、不阻塞”的定时器太顺手了。下面给你详细说说两种方案:

一、用CODESYS内置函数直接替代millis()

其实CODESYS自带了类似的系统时间函数,最常用的是SysTimeGetMs()(在SysLibTime标准库中),它返回的是系统启动以来经过的毫秒数,和millis()的逻辑完全一致!

用法很简单:

  1. 先确保你的项目已经添加了SysLibTime库(一般新建项目默认会包含,如果没有就去库管理器里找)
  2. 声明一个DWORD类型的变量来存储时间值,比如:
VAR
    CurrentMillis : DWORD;
    PreviousMillis : DWORD;
    Interval : DWORD := 1000; // 1秒间隔
END_VAR
  1. 在循环(比如OB1)里调用函数并判断时间差:
CurrentMillis := SysTimeGetMs();

// 类似Arduino里的非阻塞延时逻辑
IF CurrentMillis - PreviousMillis >= Interval THEN
    // 这里写你要周期性执行的代码
    PreviousMillis := CurrentMillis;
END_IF

注意:SysTimeGetMs()返回的DWORD值会在约49.7天后溢出,如果你需要更长时间的计时,可以用SysTimeGetUs()(微秒级)或者SysTimeGetNs()(纳秒级),它们的溢出时间会更久。

二、自定义定时器功能块(更灵活的封装)

如果想要像Arduino的millis()那样封装成更易用的工具,或者需要多个独立的定时器,可以自己写一个功能块(FB)。比如:

FUNCTION_BLOCK FB_MillisTimer
VAR_INPUT
    Start : BOOL; // 启动定时器的触发信号
    Reset : BOOL; // 重置定时器
END_VAR
VAR_OUTPUT
    ElapsedMs : DWORD; // 已流逝的毫秒数
    IsRunning : BOOL; // 定时器是否在运行
END_VAR
VAR
    _startTime : DWORD;
    _currentTime : DWORD;
END_VAR

// 实现逻辑
IF Reset THEN
    ElapsedMs := 0;
    IsRunning := FALSE;
    _startTime := 0;
ELSIF Start AND NOT IsRunning THEN
    _startTime := SysTimeGetMs();
    IsRunning := TRUE;
ELSIF IsRunning THEN
    _currentTime := SysTimeGetMs();
    ElapsedMs := _currentTime - _startTime;
END_IF

使用这个功能块的示例:

VAR
    MyTimer : FB_MillisTimer;
    Trigger : BOOL;
END_VAR

// 启动定时器
MyTimer(Start := Trigger, Reset := FALSE);

// 检查是否过了2秒
IF MyTimer.ElapsedMs >= 2000 THEN
    // 执行操作
    MyTimer.Reset := TRUE; // 用完重置
END_IF

这种自定义的FB可以轻松创建多个独立的定时器,互不干扰,非常适合复杂项目。

内容的提问来源于stack exchange,提问作者lorex04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:11:46