CODESYS开发教程8-定时、触发和计数
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
今天继续我们的小白教程老鸟就不要在这浪费时间了😊。
前面一期我们介绍了CODESYS的字符串及其操作。这一期主要介绍CODESYS的定时器及触发的相关功能块特性及用法注意本文介绍的定时器、触发器和计数器均包含在CODESYS的Standard库中。
一、定时器
CODESYS的计时器功能块有TOF、TON、TP和RTC三种。
1.时间常量
使用定时器首先需要了解CODESYS的时间常量。可以使用TIME常量来操作标准计时器模块。TIME常数的长度为32位因此分辨率为毫秒。
<time keyword> # <length of time>
<time keyword>TIME | time | T | t
<length of time>( <…>d )? ( <…>h )? ( <…>m )? ( <…>s )? (<…>ms)? // ( ...)? 可选
时间单位如下
D | d天
H | h小时
M | m分钟
s | s秒
MS | ms毫秒
注意
1时间常量前面需要加入标识T#否则不会当做时间处理。
2低位的时间常量要符合时间的范围要求即在前面有更大的时间单位时分和秒最多为60。
3时间常量的给定要按照从大到小的顺序即天(d)-小时(h)-分(m)-秒(s)-毫秒(ms)颠倒后会报错。
4
使用示例
T1 : TIME := T#14ms;
T2 : TIME := T#100s12ms; //最大时间单位处允许溢出
T3 : TIME := T#12h34m15s;
timLongest := T#49D17H2M47S295MS; // 4294967295
错误示例
timIncorrect := t#5m88s; //低位溢出秒大于60
timIncorrect1 := 15ms; //缺少时间标识T#
timIncorrect2 := t#5ms8d; //时间单位的顺序错误
此外时间常数LTIME可作为高分辨率计时器的时间基础。LTIME常数的长度为64位因此分辨率为纳秒。其使用格式与TIME类似只是关键词为“LTIME”或“ltime”还有附加的时间单位US | us-微秒NS | ns-纳秒。
示例
ltim1 := LTIME#888d8h8m8s8ms8us8ns;
ltim2 := LTIME#999m1999999999999ns;
2.TON
具有开启延迟的计时器。
IN输入上升沿启动延迟计时器下降沿重置计数器。
PT输入延迟计数器的时间默认为ms。
Q输出IN为FALSE输出为FALSEIN为TRUE且延迟时间PT已过输出为TRUE。
ET输出从IN出现上升沿起到Q输出所经过时间。
TON的时序如下图所示
注意
1TON的输出状态与IN的状态相关。如果延时导通之后IN一直保持为TRUE则输出Q的值一直为TRUE如果在延迟开启后IN变为FALSE则输出变为FALSE。
2PT的默认单位为ms可以使用INT_TO_TIME()函数将INT类型转换为时间类型。
使用示例延时5s输出
delay : TON ;
delay (IN := TRUE, PT:= T#5s);
out := delay.Q
3.TOF
具有关闭延迟的计时器。
IN输入下降沿启动延迟计时器上升沿重置计数器。
PT输入延迟计数器的时间单位默认为ms。
Q输出IN为TRUE输出为TRUEIN为FALSE且延迟时间PT已过输出为FALSE。
ET输出从IN出现上升沿起到Q输出所经过时间。
TOF的时序如下图所示
注意当IN由FALSE变为TRUE时输出Q由于FALSE变为TRUE并开始保持Q输出为TRUE当IN由TRUE变为FALSE时捕获到下降沿开始延迟关闭输出Q保持为TRUE直到延迟关闭时间到输出Q才变为FALSE。IN的高电平需要保持一定的时间才能保证TOF重置成功。
使用示例延时5s关闭
delay : TOF ;
delay (IN := TRUE, PT:= T#5s);
out := delay.Q
4.TP
脉冲计时器。
IN输入上升沿启动脉冲计时器并将Q设置为TRUE。
PT输入时间上限。
Q输出脉冲信号IN为上升沿则在PT时间内设置为TRUE。当延迟时间PT已过则为FALSE。
ET脉冲计时器启动后所经过时间单位ms。到达PT后ET值保持恒定。
TP的时序如下图所示
4.RTC
计算自给定开始时间以来的经过时间。当PDT设置为DT#1970-01-01-00-00:00或未连接时此功能块可用作工作小时计数器。
EN输入TRUE则将CDT设置为PDTCDT以秒为单位开始计时并且只要EN为TRUE就以CDT返回。FALSE则CDT设置为初始值DT#1970-01-01-00:00:00。
PDT输入预设日期和时间。
Q 输出只要CDT正在计数则为TRUE否则为FALSE。
CDT输出从PDT以来经过的时间。EN为FALSE时为从DT#1970-01-01-00:00:00以来的时间即当前日期和时间。
使用示例返回自2023-01-10-14:00:00以来经过的时间。
RTC(EN:=bFlag, PDT:=DT#2023-01-10-14:00:00, Q=>bOut, CDT=>VarTimeCur);
二、触发器
CODESYS的触发器功能块有下降沿触发F_TRIG和上升沿触发R_TRIG两种。
1.F_TRIG-下降沿触发
检测布尔信号的下降沿。
CLK输入待检测的布尔信号。
Q输出TRUE为检测到下降沿。
注意检测到CLK有下降沿TRUE->FALSE时变为TRUE持续一个周期下一周期变为FALSE。
使用示例
trig : F_TRIG ;
trig(CLK:= bIn);
bOut:= trig.Q;
2.R_TRIG-上升沿触发
检测布尔信号的上升沿。
CLK输入待检测的布尔信号。
Q输出TRUE为检测到上升沿。
注意检测到CLK有上升沿FALSE->TRUE时变为TRUE持续一个周期下一周期变为FALSE。
使用示例
trig : R_TRIG ;
trig(CLK:= bIn);
bOut:= trig.Q;
三、计数器
CODESYS的计数器功能块有递减计数器CTD、递增计数器CTU和双向计数器CTUD三种。
1.CTD-递减计数器
CD输入检测到上升沿则CV值减1直至为0。
LOAD输入为TRUE时则重置计数器将CV设为初始值PV。
PV输入计数器的初始值。
Q输出CV为0时输出TRUE。
CV输出当前计数值。
使用示例从100递减计数
decCnt : CTD ;
decCnt (CD:= bIn, LOAD:=bReset , PV:= 100);
bOut := decCnt.Q ;
curCnt := decCnt.CV;
2.CTU-递增计数器
CU输入检测到上升沿则CV值加1直至大于等于PV。
RESET输入为TRUE时则重置计数器将CV设为0。
PV输入计数器的上限。
Q输出CV>=PV时输出TRUE。
CV输出当前计数值。最大值为6553516#FFFF。
使用示例从0开始计数最大1000。
cnt: CTD ;
cnt(CD:= bIn, LOAD:=bReset , PV:= 1000);
bOut := cnt.Q ;
curCnt := cnt.CV;
3.CTUD-双向计数器
CU输入检测到CU上升沿则CV值加1。
CD输入检测到CD上升沿则CV值减1。
RESET输入为TRUE时则重置计数器将CV设为0。
LOAD输入为TRUE时则重置计数器将CV设为初始值PV。
PV输入计数器的初始值或者计数上限。
QU输出CV>=PV时输出TRUE。
QD输出CV为0时输出TRUE。
CV输出当前计数值。
注意CODESYS中用于PV的数据类型WORD与IEC标准不匹配IEC标准为PV定义了数据类型INT。
cnt: CTD ;
cnt(CU := bCU, CD:= b,CD RESET := bReset, LOAD:=bLoad , PV:= 1000);
bQU := cnt.QU ;
bQD := cnt.QD ;
curCnt := cnt.CV;
四、结论
定时器和触发器应该说是PLC里面使用频率很高的功能。定时器功能比较好理解对于初学者需要弄清楚的其实是怎么输入定时时间以及如何判断定时时间到了。触发器功能主要用来检测信号的变化需要搞清楚信号持续时间以及触发后的状态变化。计数器功能也比较好理解但是实际上用的不是很多ST里面很多时候都是用变量代替了。这些功能块都可以在仿真模式下运行写个小程序仿真跑一下基本就清楚怎么用了^-^。
------------------
原创不易感兴趣的多支持