CODOSYS之结构化文本(ST)——中级篇(一)计时器的应用

标准库中常用的计时器有如下四个(部分环境还支持高精度计时器如LTON等等):

.RTC

.TON

.TOF

.TP

本文将对将对上述四个计时器进行简单的讲解。

.RTC: 

RunTime 时钟定时器,返回启动时间,当前时间和日期。

Inputs:

EN : BOOL; 一个上升沿启动 CDT 中时间统计。

PDT : DATE_AND_TIME; 计数将要启动的时间和日期。

Outputs:

Q : BOOL; 当 CDT 开始计数输出为 TRUE 。

CDT : DATE_AND_TIME; 当前计数时间和日期的状态

VarBOOL2:=RTC(EN, PDT, Q, CDT) 表示:当EN为 FALS,输出变量 Q 以及 CDT 为 FALSE 相关时间为 DT#1970-01-01-00:00:00。

一旦 EN 为 TRUE (上升沿),PDT给予的时间将会被设置,并且将会以秒进行计数一旦 EN 为TRUE 将返回 CDT 。一旦 EN 被复位为 FALSE, CDT 将会被复位为初始值 DT#1970-01-01-00:00:00。

Example:

Variable definition

VAR  
  My_RTC:     RTC;            (* instance of FB RTC *)
  My_EN:      BOOL;           (* PDT will be loaded, if EN
                                 gets a rising edge *)
  My_PDT:     DATE_AND_TIME;  (* date and time preset *)
  My_Result:  BOOL;           (* copy of EN *)
  My_CDT:     DATE_AND_TIME;  (* present time and date,
                                 valid: EN = 1 *)
END_VAR

 

Function call ST

My_RTC(EN  := My_EN, PDT := My_PDT); 
My_Result  := My_RTC.Q;
My_CDT     := My_RTC.CDT;

.TON

定时器功能块,实现一个定时。当输入为 TRUE,将会启动一个定时器知道输出为 TRUE。

Inputs:

IN : BOOL; 上升沿启动 ET 端定时。

PT : TIME; 定时 ET (延迟时间) 的上限。

Outputs:

Q : BOOL; 一旦 ET 到达显示时间 PV 输出将会变为 TRUE (定时时间结束)。

ET : 定时时间的当前状态

TON(IN, PT, Q, ET) 表示: 如果 IN 为 FALSE, Q 将会为 FALSE 并且 ET 为 0。

一旦 IN 为 TRUE,时间将会在 ET 端以毫秒进行计时知道等于 PT值。然后将会保持一个常量。

当 IN 为 TRUE 并且 ET 等于 PT 时 Q 为TRUE,否则为 FALSE。

因此,当定义时间 PT 按照毫秒运行结束时 Q 将会得到一个上升沿。

Example:

VAR  
  My_TON:   TON;    (* instance of FB TON *)
  My_IN:    BOOL;   (* starts timer with a rising edge,
                       resets timer with a falling edge *)
  My_PT:    TIME;   (* time that must elapse, before Q
                       is set *)
  My_Puls:  BOOL;   (* pulse TRUE, as soon as delay has
                       elapsed *)
  My_Time:  TIME;   (* elapsed duration of the delay
                       (between 0 and PT) *)
END_VAR

 

Function call ST

My_TON(IN := My_IN, PT := My_PT);
My_Puls   := My_TON.Q;
My_Time   := My_TON.ET;

.TOF

 定时器功能块,用于一个关闭延时。当输入从 TRUE 到 FALSE (下降沿),在一段时间滞后输出将会被置为 FALSE。

Inputs:

IN : BOOL; 下降沿启动 ET 端计时。

PT : TIME; ET端计时上限值 (延迟时间)。

Outputs:

Q : BOOL; 一旦 ET 到达上限值 PV 那么将会得到一个下降沿(延时时间结束)。

ET : 当前延时定时器状态。

TOF(IN, PT, Q, ET) 表示:如果 IN 为 TRUE,输出将会为 TRUE 。

一旦 IN 为 FALSE,在 ET 端时间将按照毫秒的形式开始计时直到 ET 的值等于 PT 的值。然后将保持一个常量。

当 IN 为 FALSE 并且 ET 等于 PT Q 为 FALSE 。否则为 TRUE。

因此,当 PT 以毫秒到达指定时间后 Q 将会得到一个下降沿。

Example:

VAR  
  My_TOF:   TOF;    (* instance of FB TOF *)
  My_IN:    BOOL;   (* starts timer with a falling edge,
                       resets timer with a rising edge *)
  My_PT:    TIME;   (* time that must elapse, before Q
                       is set *)
  My_Puls:  BOOL;   (* pulse FALSE, as soon as delay has
                       elapsed *)
  My_Time:  TIME;   (* elapsed duration of the delay
                       (between 0 and PT) *)
END_VAR

 

Function call ST

My_TOF(IN := My_IN, PT := My_PT); 
My_Puls   := My_TOF.Q;
My_Time   := My_TOF.ET;

 .TP

定时器功能块,作为一个触发器。时间将会增加知道到达指定时间。在计时过程中为 TRUE 其他时候为 FALSE。

Inputs:

IN : BOOL; 一个上升沿将启动 ET 端计时器。

PT : TIME; 定时时间

Outputs:

Q : BOOL; 时间计时到 ET 输出为 TRUE。

ET : TIME; 当前时间状态

TP(IN, PT, Q, ET) 表示:如果 IN 为 FALSE, Q 将会变为 FALSE 并且 ET将为 0

一旦输入 IN 变为 TRUE,时间将按照毫秒开始从 ET 端进行计时知道时间值到达 PT。然后将保持一个常量。

IN 为 TRUE 并且ET 小于 PT 时 Q 为 TRUE 。否则为 FALSE。

Q 返回到达时间 PT 的信号。

 

Example:

Variable definition

VAR  
  My_TP:    TP;     (* instance of FB TP is created *)
  My_IN:    BOOL;   (* trigger for the start signal *)
  My_PT:    TIME;   (* length of the high signal in 10 ms *)
  My_Puls:  BOOL;   (* pulse TRUE, as long as timer is
                       running *)
  My_Time:  TIME;   (* elapsed time (between 0 and PT) *)
END_VAR

 

Function call ST

My_TP(IN := My_IN, PT := My_PT);
My_Puls  := My_TP.Q;
My_Time  := My_TP.ET;

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用结构化文本语言(STL)编写的一个简单的交通灯代码: ``` PROGRAM Traffic_Lights VAR PedestrianRequest: BOOL := FALSE; // 行人请求信号 GreenLightTimer: WORD := 0; // 绿灯计时器 YellowLightTimer: WORD := 0; // 黄灯计时器 RedLightTimer: WORD := 0; // 红灯计时器 currentState: INT := 0; // 当前状态 // 状态常量 GreenLight: INT := 0; YellowLight: INT := 1; RedLight: INT := 2; END_VAR // 主程序 MAIN // 根据当前状态进行处理 CASE currentState OF GreenLight: // 绿灯状态,计时器自减 GreenLightTimer := GreenLightTimer - 1; // 如果行人请求信号被触发,则切换到黄灯状态 IF PedestrianRequest THEN currentState := YellowLight; YellowLightTimer := 5; // 设置黄灯计时器为5秒 END_IF // 如果绿灯计时器倒计时结束,则切换到黄灯状态 IF GreenLightTimer = 0 THEN currentState := YellowLight; YellowLightTimer := 5; // 设置黄灯计时器为5秒 END_IF YellowLight: // 黄灯状态,计时器自减 YellowLightTimer := YellowLightTimer - 1; // 如果黄灯计时器倒计时结束,则切换到红灯状态 IF YellowLightTimer = 0 THEN currentState := RedLight; RedLightTimer := 10; // 设置红灯计时器为10秒 END_IF RedLight: // 红灯状态,计时器自减 RedLightTimer := RedLightTimer - 1; // 如果红灯计时器倒计时结束,则切换到绿灯状态 IF RedLightTimer = 0 THEN currentState := GreenLight; GreenLightTimer := 15; // 设置绿灯计时器为15秒 END_IF // 如果行人请求信号被触发,则延长红灯时间,直到行人通过 IF PedestrianRequest THEN RedLightTimer := RedLightTimer + 5; // 延长红灯计时器5秒 END_IF END_CASE END_PROGRAM ``` 该代码实现了一个基本的交通灯控制器,包括绿灯、黄灯和红灯三种状态,并且可以响应行人请求信号。在实际使用时,需要根据实际情况进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值