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

引言

在 PLC 编程中,许多任务要求实时监测和响应外部信号的变化,尤其是对输入信号进行一定时间的判断,以决定系统的状态。在这种应用场景下,定时器功能显得尤为重要。

本篇文章将详细分析一个 PLC 程序实例——"PM_LongPressOut"功能块,该功能块实现了基于长按检测的启动控制。我们将根据实际编程经验,逐步解析程序的功能、逻辑结构,并讨论它的实际应用场景。

1  功能需求分析

在工业控制中,许多设备和机器的启动或停止依赖于外部信号。例如,一些系统要求用户按下按钮或开关并持续一段时间才能触发设备的启动,短暂的按下则不做反应。这个需求实际上就涉及到一个“长按检测”的过程。长按检测可以通过 PLC 中的定时器实现,按下按钮后,PLC 计时器开始工作,直到计时器达到预设的时间阈值,系统才会做出相应的响应。

本文中的“PM_LongPressOut”功能块正是用来实现这个控制功能的。它根据输入信号Start、Stop和定时器TimeLimit,控制输出State的变化,从而实现长按启动和停止的功能。

2  程序代码与解析

2.1 程序代码

  • FUNCTION_BLOCK "PM_LongPressOut"
  • { S7_Optimized_Access := 'TRUE' }  // 启用优化访问
  • VERSION : 0.1  // 程序版本
  • VAR_INPUT
  •      Start : Bool;  // 启动信号,布尔类型,当为TRUE时开始计时
  •      Stop : Bool;   // 停止信号,布尔类型,当为TRUE时停止计时并清空状态
  •      TimeLimit : Time := T#5S;  // 长按时间阈值,默认值为5秒
  • END_VAR
  • VAR_OUTPUT
  •      State : Bool := FALSE;  // 状态输出,FALSE表示设备停止,TRUE表示设备启动
  • END_VAR
  • VAR
  •      Timer_Ton{S7_SETPOINT := 'False'; InstructionName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;  // 定时器,用于检测长按时间
  • END_VAR
  • BEGIN
  •                 // 启动定时器,当Start信号为TRUE时启动定时器
  •                 IF #Start THEN
  •                       #Timer_Ton(IN := TRUE,  // 激活定时器
  •                                           PT := #TimeLimit);  // 设置定时器的时间阈值
  •                 ELSE
  •                       RESET_TIMER(#Timer_Ton);  // 如果Start信号为FALSE,重置定时器
  •                 END_IF;
  •                 // 当定时器达到设定时间阈值时,触发设备启动
  •                 IF #Timer_Ton.Q THEN
  •                       #State := TRUE;  // 将状态设置为TRUE,表示设备启动
  •                 END_IF;
  •                 // 停止定时器并清空状态,当Stop信号为TRUE时
  •                 IF #Stop THEN
  •                        RESET_TIMER(#Timer_Ton);  // 停止定时器
  •                        #State := FALSE;  // 将状态设置为FALSE,表示设备停止
  •                 END_IF;
  • END_FUNCTION_BLOCK 

2.2 程序解析

函数块声明

  • FUNCTION_BLOCK "PM_LongPressOut"
  • { S7_Optimized_Access := 'TRUE' }
  • VERSION : 0.1
  • VAR_INPUT
  •      Start : Bool;                   // 启动信号 
  •      Stop : Bool;                    // 停止信号
  •      TimeLimit : Time := T#5S;       // 长按的时间阈值
  • END_VAR

在程序的开头,定义了一个名为PM_LongPressOut的函数块,版本号为 0.1。此功能块包含三个输入变量:

  • Start:布尔类型,用于接收启动信号。

  • Stop:布尔类型,用于接收停止信号。

  • TimeLimit:时间类型,默认设置为 5 秒,用于定义长按触发的时间阈值。

输出变量声明

  • VAR_OUTPUT
  •      State : Bool := FALSE;   // 状态,FALSE表示停止,TRUE表示启动
  • END_VAR

声明了一个输出变量State,用于表示当前状态。初始化值为FALSE,表示默认状态为停止状态。当状态变为TRUE时,表示系统处于启动状态。

内部变量声明

  • VAR
  •      Timer_Ton{S7_SETPOINT := 'False'; InstructionName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;            // 定时器
  •  END_VAR

此部分声明了一个定时器Timer_Ton,它使用了 TON(延时通定时器),TON_TIME为定时器的时间类型。定时器将在Start信号触发时启动,用于计时长按操作是否满足设定的时间阈值。

程序的执行逻辑

  • // 启动定时器
  • IF #Start THEN 
  •       #Timer_Ton(IN := TRUE, 
  •                           PT := #TimeLimit);
  • ELSE
  •       RESET_TIMER(#Timer_Ton);
  •  END_IF;
  • // 长按达到时间,状态为1
  • IF #Timer_Ton.Q THEN
  •        #State := TRUE;
  • END_IF;
  • // 停止定时器并清空状态
  • IF #Stop THEN
  •       RESET_TIMER(#Timer_Ton);
  •        #State := FALSE;
  • END_IF;                          

这部分包含程序的核心逻辑,执行了以下步骤:

启动定时器:当Start信号为TRUE时,启动定时器Timer_Ton,定时器将开始计时,计时的上限是TimeLimit(即 5 秒)。如果Start信号为FALSE,则通过RESET_TIMER函数重置定时器。

长按触发状态:当定时器Timer_Ton.Q(定时器完成)为TRUE时,表示长按时间已达到阈值,此时将输出State设置为TRUE,表示设备启动。

停止定时器并清空状态:当Stop信号为TRUE时,停止定时器并通过RESET_TIMER将定时器清空。同时,将State状态设置为FALSE,表示设备停止。

应用场景

此功能块广泛应用于需要长按按钮才能启动的控制系统。例如:

自动化设备启动控制:在一些设备的启动控制中,为了避免误触发,要求用户长按启动按钮才能激活设备。这种应用场景下,定时器能够帮助判断按下时间是否足够长。

紧急停止控制:在一些紧急停止的应用中,用户可能需要长按停止按钮来确保设备完全停机,防止误操作。该功能块同样适用。

工业生产线操作:在生产线的控制中,可能需要通过长按某个按钮来启动或停止某个特定的工艺步骤。这种长按检测功能能够有效提升操作的安全性和稳定性。

总结

本文通过对 PLC 程序PM_LongPressOut的详细分析,介绍了如何通过长按检测实现设备的启动和停止控制。程序利用了定时器功能,在特定的时间阈值内判断是否需要启动设备,确保操作的准确性和安全性。通过程序解释,我们可以更清晰地理解每一部分的功能。该程序的实际应用场景广泛,适用于工业自动化控制中对长按操作的需求。

往期回顾

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

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

图片

2025年04月