每周一个编程小例子:记录设备运行时间
引言
在现代工业自动化控制系统中,PLC(可编程逻辑控制器)已经成为了实现精确控制、数据采集和处理的核心工具之一。在许多 PLC 应用中,运行时间记录器是非常重要的一部分,尤其是在一些设备运行状态监控和维护管理中。本文将介绍一个典型的 PLC 程序模块——PM_MotorRunTimeRecorder_v2,并结合实际的编程经验,深入分析其功能实现、应用场景及程序结构,帮助读者理解如何通过这个模块实现对电机等设备运行时间的准确记录。
1 PLC 程序模块概述
1.1 程序代码
- FUNCTION_BLOCK 'PM_MotorRunTimeRecorder_v2'
- { S7_Optimized_Access := 'TRUE' }
- VERSION : 0.1
- VAR_INPUT
- RunningSignal : Bool;
- '1hzClock' : Bool;
- Reset : Bool;
- END_VAR
- VAR_IN_OUT
- RunTime : DInt;
- Days : Int;
- Hours : Int;
- Minutes : Int;
- Seconds : Int;
- END_VAR
- VAR
- ClockRiseHf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
- END_VAR
- VAR_TEMP
- ClockRise : Bool;
- END_VAR
- BEGIN
- //上升沿判断
- #ClockRise := #'1hzClock' AND NOT #ClockRiseHf;
- #ClockRiseHf := #'1hzClock';
- IF #RunningSignal AND #ClockRise THEN
- #RunTime += 1;
- #Seconds += 1;
- IF #Seconds >= 60 THEN
- #Minutes += 1;
- #Seconds := 0;
- END_IF;
- IF #Minutes >= 60 THEN
- #Hours += 1;
- #Minutes := 0;
- END_IF;
- IF #Hours >= 24 THEN
- #Days += 1;
- #Hours := 0;
- END_IF;
- END_IF;
- IF #Reset THEN
- #RunTime := 0;
- #Days := 0;
- #Hours := 0;
- #Minutes := 0;
- #Seconds := 0;
- END_IF;
- END_FUNCTION_BLOCK
1.2 模块功能
该功能模块的核心功能是记录设备在启动信号持续为真时的运行时间。在设备运行时,模块能够实时更新其运行时间,并将其分解为“天”、“小时”、“分钟”和“秒”四个时间单位。此外,模块还能够通过一个复位信号将所有计时数据重置为零。这个功能对于工业设备的日常维护非常重要,它能帮助维护人员判断设备的使用情况,预判设备的维护周期。
1.3 应用场景
PM_MotorRunTimeRecorder_v2功能模块在许多工业应用中都非常实用,特别是在那些需要记录设备运行时间以便进行定期保养和维护的场合。典型的应用场景包括:
电机运行时间监控:用于记录电机等设备的运行时间,进而帮助安排定期维护。
工厂自动化控制系统:用于监控工厂内不同设备的运行状态,确保设备在最佳状态下运行。
生产线监控:在生产线中,许多设备会连续运行,通过记录运行时间可以有效预测设备故障,减少生产线停机时间。
节能管理系统:设备运行时间长短直接影响能源消耗,通过合理监控运行时间,可以优化设备的使用,减少能源浪费。
2 程序分析
2.1 输入、输入输出和局部变量声明
- VAR_INPUT
- RunningSignal : Bool; // 运行信号输入,表示电机是否处于运行状态
- '1hzClock' : Bool; // 1Hz时钟信号,用于每秒钟更新一次计时器
- Reset : Bool; // 复位信号,控制计时器的重置
- END_VAR
- VAR_IN_OUT
- RunTime : DInt; // 设备总运行时间,单位为秒
- Days : Int; // 设备运行天数
- Hours : Int; // 设备运行小时数
- Hours : Int; // 设备运行小时数
- Minutes : Int; // 设备运行分钟数
- Seconds : Int; // 设备运行秒数
- END_VAR
RunningSignal:一个布尔输入信号,用于指示电机是否正在运行。当电机运行时,该信号为真,表示电机启动,功能块开始计时。
'1hzClock':一个 1Hz 时钟信号(每秒钟更新一次),用于驱动计时器。
Reset:一个布尔信号,用于将计时器重置为零。当该信号为真时,所有计时值(总运行时间、天数、小时、分钟、秒数)都会被清零。
RunTime:设备的总运行时间,单位为秒。
Days、Hours、Minutes、Seconds:分别表示设备的运行时间(以天、小时、分钟和秒为单位)。这些变量是输出变量,用于显示设备运行的具体时间。
- VAR
- ClockRiseHf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
- END_VAR
ClockRiseHf:该变量用于记录上一次时钟信号的状态。通过判断当前时钟信号的上升沿来进行计时更新。
- VAR_TEMP
- ClockRise : Bool; // 临时变量,用于判断时钟信号是否发生上升沿
- END_VAR
ClockRise:一个临时变量,用于判断时钟信号是否发生了上升沿。该变量在程序中用于计时。
2.2 上升沿判断逻辑
- // 上升沿判断
- // 上升沿判断#ClockRise := #'1hzClock' AND NOT #ClockRiseHf;
- #ClockRiseHf := #'1hzClock';
这一部分代码用于检测 1Hz 时钟信号的上升沿。ClockRise变量表示 1Hz 时钟信号由低到高跳变的时刻,即每一秒钟的起始时刻。
通过判断1hzClock与ClockRiseHf的关系,来确定时钟信号是否发生上升沿。
2.3 计时逻辑
- IF #RunningSignal AND #ClockRise THEN
- #RunTime += 1;
- #Seconds += 1;
- IF #Seconds >= 60 THEN
- #Minutes += 1;
- #Seconds := 0;
- END_IF;
- IF #Minutes >= 60 THEN
- #Hours += 1;
- #Minutes := 0;
- END_IF;
- IF #Hours >= 24 THEN
- #Days += 1;
- #Hours := 0;
- END_IF;
- END_IF;
这里是计时的核心部分。当RunningSignal为真且时钟信号发生上升沿时,计时器开始增加:
RunTime每秒钟增加 1,表示设备总的运行时间增加 1 秒。
Seconds每秒钟增加 1,当秒数达到 60 时,重置为 0 并将Minutes增加 1。
Minutes每当达到 60 时,重置为 0 并将Hours增加 1。
Hours每当达到 24 时,重置为 0 并将Days增加 1。
这样,通过不断地更新秒、分钟、小时和天数的值,逐步记录电机的运行时间。
2.4 复位逻辑
- IF #Reset THEN
- #RunTime := 0;
- #Days := 0;
- #Hours := 0;
- #Minutes := 0;
- #Seconds := 0;
- END_IF;
如果复位信号Reset为真,所有的计时器变量(RunTime、Days、Hours、Minutes、Seconds)将被清零,计时器重新开始计时。
总结
通过本程序的分析,我们可以看到,PM_MotorRunTimeRecorder_v2功能模块提供了一个非常实用的计时功能。在电机或其他设备运行的过程中,通过该功能模块,我们能够精准地记录其运行时长,并将其细分为天、小时、分钟和秒,方便进行数据监控和设备维护。复位功能也能够帮助操作人员在需要时清除计时数据,重新开始计时。
随着工业自动化的不断发展,对于设备运行状态的监控需求将越来越高。通过精确的运行时间记录,企业可以优化设备的维护策略,提前预警潜在故障,减少意外停机时间。此外,随着物联网(IoT)和智能制造的普及,PLC 与云端系统的数据交互将更加紧密,类似的计时功能模块将在设备监控、故障诊断和预测性维护等方面发挥越来越重要的作用。
往期回顾
每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比
2025年04月