每周一个编程小例子:自定义循环执行控制程序
引言
在工业自动化和控制系统中,循环执行控制常常用于多种设备和任务的定时、周期性操作。PLC(可编程逻辑控制器)作为核心控制单元,广泛应用于工业生产过程中的自动化控制。在一些场景中,需要实现设备按设定的周期性进行任务执行,比如定时打开或关闭设备,或者按照一定的次数进行循环执行。为了满足这一需求,本文介绍了一款 PLC 功能块——FB_CyclicExecutor,该功能块能够按照设定的循环周期和次数,精准控制设备的循环执行。
1 程序代码及介绍
下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):
- FUNCTION_BLOCK FB_CyclicExecutor
- VAR_INPUT
- IN_Start : BOOL; // 启动循环
- IN_Stop : BOOL; // 停止循环
- IN_CycleTime : TIME; // 循环周期
- IN_CycleCount : UDINT; // 循环次数设定(0表示无限循环)
- IN_Reset : BOOL; // 复位
- END_VAR
- VAR_OUTPUT
- OUT_Execute : BOOL; // 执行输出
- OUT_CurrentCount : UDINT; // 当前循环计数
- OUT_Busy : BOOL; // 正在循环执行
- OUT_Done : BOOL; // 循环完成(仅当有限次数时)
- END_VAR
- VAR
- Timer_Cycle : TON;
- CycleActive : BOOL;
- InternalCount : UDINT;
- LastStart : BOOL;
- END_VAR
- // 功能说明:实现设备按照设定的循环次数或循环时间周期性地执行动作
- // 检测启动信号的上升沿
- IF IN_Start AND NOT LastStart THEN
- CycleActive := TRUE;
- InternalCount := 0;
- OUT_Done := FALSE;
- END_IF
- // 停止处理
- IF IN_Stop THEN
- CycleActive := FALSE;
- END_IF
- // 循环执行逻辑
- IF CycleActive THEN
- Timer_Cycle(IN := NOT Timer_Cycle.Q, PT := IN_CycleTime);
- OUT_Execute := Timer_Cycle.Q;
- // 计数:在每次循环的上升沿计数
- IF Timer_Cycle.Q THEN
- InternalCount := InternalCount + 1;
- END_IF
- // 检查循环次数是否达到设定
- IF IN_CycleCount > 0 THEN
- IF InternalCount >= IN_CycleCount THEN
- CycleActive := FALSE;
- OUT_Done := TRUE;
- END_IF
- END_IF
- ELSE
- Timer_Cycle(IN := FALSE);
- OUT_Execute := FALSE;
- END_IF
- OUT_CurrentCount := InternalCount;
- OUT_Busy := CycleActive;
- // 复位处理
- IF IN_Reset THEN
- CycleActive := FALSE;
- InternalCount := 0;
- OUT_Done := FALSE;
- Timer_Cycle(IN := FALSE);
- END_IF
- LastStart := IN_Start;
2 程序代码解析
输入变量:
-
IN_Start:启动循环的控制信号。
-
IN_Stop:停止循环的控制信号。
-
IN_CycleTime:每个循环周期的时间设定。
-
IN_CycleCount:设定循环次数,0 表示无限循环。
-
IN_Reset:复位信号,用于清除内部计数并停止循环。
输出变量:
-
OUT_Execute:表示当前是否在执行循环。
-
OUT_CurrentCount:当前已执行的循环次数。
-
OUT_Busy:表示功能块是否正在执行循环。
-
OUT_Done:表示循环是否完成(当设定了有限循环次数时使用)。
内部变量:
-
Timer_Cycle:一个定时器,用于控制每次循环的周期。
-
CycleActive:表示是否处于活动状态。
-
InternalCount:用于存储循环执行的计数。
-
LastStart:用于检测启动信号的上升沿。
3 应用场景
FB_CyclicExecutor功能块主要用于需要周期性执行的场合。它能够精确控制任务的执行时间和次数,适用于以下几种常见的工业场景:
定时控制:如控制电机定时启停,灯光开关等,尤其适用于需要精确控制时序的应用。
自动化生产线:可以用于物料搬运、设备检测、喷涂或包装等任务,按照设定的时间或次数循环执行。
自动测试系统:在自动化测试系统中,可能需要多次执行同一个操作,确保测试的全面性与稳定性。
节能控制:比如在特定时间段内控制设备开启和关闭,以节约能源。
4 拓展思考
该功能块不仅能够完成基本的循环执行任务,还具备一定的扩展性和优化空间:
支持多个任务并行执行:可以在同一程序中增加多个循环执行器,支持多个任务并行控制,提升生产线的灵活性。
增加动态调整功能:通过增加动态修改周期时间和循环次数的功能,可以实现更为复杂的动态控制需求,例如在生产过程中根据实际情况调整执行频率。
报警功能:增加循环次数未完成或循环过程中出现异常时的报警功能,便于运维人员及时发现并处理问题。
与其他控制系统集成:可以与其他自动化系统集成,形成更加复杂的控制逻辑,如与 PLC 网络或 SCADA 系统联动,提升整体自动化水平。
总结
FB_CyclicExecutor功能块通过实现简单、精确的周期性任务控制,为工业自动化系统提供了一种高效的解决方案。它不仅能够满足定时任务和循环次数的需求,还具备一定的扩展性,能够根据不同的应用场景进行灵活调整。通过合理的配置和应用,这一功能块能够帮助工程师高效地实现设备控制、生产调度及自动化操作,提升生产效率与控制精度。
你来出题 我来答


欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。
往期回顾
每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比
每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用
2025年12月


