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

引言

想象一下汽车启动:先通电自检(从设备),再点火引擎(主设备);停车时先熄火(主设备),后断电(从设备)。这种精妙的时序控制,在工业自动化中同样至关重要,它能有效保护设备、提升系统寿命。今天了解的 PLC 功能块 StartFirstAndStopLater,正是实现这一智慧的微型引擎。

1  程序代码:时序逻辑的精密舞蹈

下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):

  • FUNCTION_BLOCK StartFirstAndStopLater
  •  
  • VAR_INPUT
  •         startSignal: BOOL;        // 启动按钮/信号 (上升沿有效)
  •         stopSignal: BOOL;         // 停止按钮/信号 (上升沿有效)
  • END_VAR
  • VAR_OUTPUT
  •         mainMotorRunning: BOOL;    // 主电机运行状态
  •         slaveMotorRunning: BOOL;   // 从电机运行状态
  • END_VAR
  •  
  • VAR 
  •         motorStartFlag : BOOL;     // 内部启动标志 (锁存启动信号)   
  •         stopFlag : BOOL;           // 内部停止标志 (锁存停止信号)
  •         mainMotorTimer: TON;       // 主电机启动延时定时器 (通电延时)
  •         slaveMotorTimer: TON;      // 从电机停止延时定时器 (通电延时)
  • END_VAR
  •  
  • // 核心逻辑开始
  • // 启动信号处理 - 锁存启动命令,直到停止信号到来
  • motorStartFlag := (startSignal OR motorStartFlag) AND NOT stopSignal;
  •  
  • // 从电机立即启动
  • IF motorStartFlag THEN 
  •         slaveMotorRunning := TRUE; // 启动标志有效,从电机直接运行
  • END_IF
  •  
  • // 主电机延时启动:等待从电机运行后开始3秒计时
  • mainMotorTimer(IN := motorStartFlag AND slaveMotorRunning, PT := T#3S); 
  •  
  • // 主电机启动条件:启动标志有效 + 从电机已运行 + 3秒计时到
  • IF motorStartFlag AND slaveMotorRunning AND mainMotorTimer.Q THEN
  •         mainMotorRunning := TRUE; // 满足条件,主电机运行
  • ELSE
  •         mainMotorRunning := FALSE; // 否则主电机停止
  • END_IF
  •  
  • // 停止信号处理 - 锁存停止命令
  • IF stopSignal THEN   
  •         stopFlag := TRUE; // 检测到停止信号,置位停止标志
  • END_IF
  •  
  • // 从电机延时停止:停止标志有效时开始3秒计时
  • slaveMotorTimer(IN := stopFlag, PT := T#3S); 
  •  
  • // 从电机停止条件:停止标志有效 + 3秒计时到
  • IF stopFlag AND slaveMotorTimer.Q THEN 
  •         slaveMotorRunning := FALSE; // 满足条件,从电机停止   
  •         stopFlag := FALSE;          // 复位停止标志,为下次启动做准备
  • END_IF      

2  代码解析

2.1 变量定义

输入与输出变量: 

  • startSignal 和 stopSignal 是控制电机启动与停止的布尔输入信号。

  • mainMotorRunning 和 slaveMotorRunning 分别表示主电机和从电机的运行状态,是输出信号。

内部变量: 

  • motorStartFlag 用于记录电机启动的标志位。

  • stopFlag 用于记录停止信号的状态。

  • mainMotorTimer 和 slaveMotorTimer 是分别用于延时启动和延时停止的定时器。

2.2  关键时序解析:

启动阶段:

  • 按下startSignal,motorStartFlag置位并保持。

  • slaveMotorRunning立即 变为 TRUE(从电机启动)。

  • mainMotorTimer 开始 3 秒 计时(条件:motorStartFlag AND slaveMotorRunning)。

  • 3 秒后,mainMotorTimer.Q 为 TRUE → mainMotorRunning 变为 TRUE(主电机启动)。

停止阶段:

  • 按下stopSignal,stopFlag 置位。

  • mainMotorRunning立即 变为 FALSE(主电机停止)。

  • slaveMotorTimer 开始 3 秒 计时(条件:stopFlag)。

  • 3 秒后,slaveMotorTimer.Q 为 TRUE → slaveMotorRunning 变为 FALSE(从电机停止),同时 stopFlag 复位。

3  核心应用场景:保护设备的安全卫士

带预润滑的系统:

  • 从电机: 润滑泵电机。

  • 主电机: 主驱动电机(如大型风机、压缩机、泵)。

  • 意义: 启动时先开润滑(从),确保轴承充分润滑后再启动主机(主),防止干磨;停止时主机先停,润滑延时关闭(从),带走残余热量。

传送带系统:

  • 从电机: 上游(进料端)传送带电机。

  • 主电机: 下游(出料端)传送带电机或加工设备。

  • 意义: 启动时先启动上游传送带(从),确保有物料供应再启动下游(主),避免空转或加工设备空载;停止时先停下游/加工设备(主),再停上游传送带(从),清空线上物料。

冷却/通风系统:

  • 从电机: 冷却风扇或水泵。

  • 主电机: 发热设备(如大功率变频器、电机、熔炉)。

  • 意义: 启动时先开冷却(从),再启动主设备(主),防止过热;停止时主设备先停(主),冷却延时关闭(从),带走余热。

4  拓展思考:让程序更强大、更智能

参数化延时时间:

  • 将 T#3S 改为输入变量 tMainStartDelay 和 tSlaveStopDelay。

  • 优点: 无需修改程序即可灵活调整延时,适应不同设备需求。

增加急停功能:

  • 添加 VAR_INPUT emergencyStop: BOOL;。

  • 在逻辑中加入 IF emergencyStop THEN mainMotorRunning := FALSE; slaveMotorRunning := FALSE; motorStartFlag := FALSE; stopFlag := FALSE; END_IF。

  • 优点: 紧急情况下立即停止所有设备,保障安全。

加入运行反馈与互锁:

  • 为 mainMotorRunning 和 slaveMotorRunning 增加实际接触器反馈信号作为互锁。

  • 优点: 防止输出命令与设备实际状态不符导致的逻辑错误,提高可靠性。

状态指示与报警:

  • 增加输出变量指示状态(如 starting, running, stopping, fault)。

  • 添加定时器监控从电机启动后主电机是否正常启动,或主电机停止后从电机是否正常停止,超时则报警。

  • 优点: 提升系统可观测性,便于故障诊断。

总结:小功能块,大价值

StartFirstAndStopLater 功能块虽小,却体现了工业自动化中 时序控制 的价值。它通过简单的 标志位锁存 和精确的 定时器调度,确保了主从设备启停的安全顺序:

  1. 启动: 从设备先行 → 主设备延时跟进。

  2. 停止: 主设备先行 → 从设备延时收尾。

这种“几秒 秒之差”的智慧,有效避免了设备因不当启停顺序而造成的 机械冲击、润滑不良、物料堆积、过热损坏 等问题,显著提升了系统的 可靠性、安全性 和 设备寿命。掌握此类基础时序逻辑的构建与优化,是每一位 PLC 工程师迈向更高水平的关键一步。将其部署到需要顺序控制的场景中,让您的自动化系统运行如精密的瑞士钟表!

图片

你来出题 我来答图片图片图片

欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。

图片

往期回顾

每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比

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

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

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

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

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

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

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

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

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

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

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

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

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

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

图片

2025年08月