每周一个编程小例子:自定义循环执行控制程序

引言

在工业自动化和控制系统中,循环执行控制常常用于多种设备和任务的定时、周期性操作。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 转换的两种实现方案对比

每周一个编程小例子:记录设备运行时间

每周一个编程小例子:基于长按检测的启动控制系统

每周一个编程小例子:探秘 PLC 数据记录功能块

每周一个编程小例子:心跳检测与 PLC 应用

每周一个编程小例子:斜坡发生器

每周一个编程小例子:旋转速度计算

每周一个编程小例子:计算 PLC 循环周期|例程需求征集!

每周一个编程小例子:如何优雅的分割字符串

每周一个编程小例子:带反馈的阀门控制程序

每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块

每周一个编程小例子:曲线加减速的控制应用

每周一个编程小例子:轻松去除字符串前导字符

每周一个编程小例子:根据阈值更新输入

每周一个编程小例子:官方模拟量输入处理模块

每周一个编程小例子:主从电机的时序控制

每周一个编程小例子:基于一阶滞后滤波的优化方案

每周一个编程小例子:16 进制到浮点数的神奇转换

每周一个编程小例子:PLC 长按控制程序

每周一个编程小例子:PLC 程序实现多位整数拆分

每周一个编程小例子:流量累积计算器

每周一个编程小例子:用于连锁的电机标准控制模块

每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用

每周一个编程小例子:自定义种子生成随机数

每周一个编程小例子:可调时间的脉冲生成器

每周一个编程小例子:带滤波的标准模拟量输入功能块

每周一个编程小例子:使用 PLC 将字符串转换为日期格式

每周一个编程小例子:PLC 配方管理

每周一个编程小例子:比较两个 DB 块(STL)

每周一个编程小例子:如何使用 PLC 实现数组逆序

每周一个编程小例子:流量累计与批次控制

图片

2025年12月

Tags: