CODESYS是否有类似Arduino millis()的定时器函数或变量?若无该如何创建?
CODESYS中替代Arduino millis()的方案:内置函数与自定义定时器
嘿,这个问题问得太实用了!很多从Arduino转CODESYS的朋友都会纠结这个点——毕竟millis()那种“随用随取、不阻塞”的定时器太顺手了。下面给你详细说说两种方案:
一、用CODESYS内置函数直接替代millis()
其实CODESYS自带了类似的系统时间函数,最常用的是SysTimeGetMs()(在SysLibTime标准库中),它返回的是系统启动以来经过的毫秒数,和millis()的逻辑完全一致!
用法很简单:
- 先确保你的项目已经添加了
SysLibTime库(一般新建项目默认会包含,如果没有就去库管理器里找) - 声明一个
DWORD类型的变量来存储时间值,比如:
VAR CurrentMillis : DWORD; PreviousMillis : DWORD; Interval : DWORD := 1000; // 1秒间隔 END_VAR
- 在循环(比如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
相关产品推荐
相关产品推荐

