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

引言

在工业自动化领域,可编程逻辑控制器(PLC)是核心控制设备之一,它能够对各种工业过程进行精确控制和监测。其中,数据记录功能对于分析工业过程的运行状况、故障诊断以及性能优化至关重要。本文将编写一个功能块,用于数据记录,命名为 “PM_Data_Recording”。

程序详细介绍

1.1 功能块概述

“PM_Data_Recording” 是一个功能块(FUNCTION_BLOCK),在 PLC 编程中,功能块是一种可复用的程序单元,类似于面向对象编程中的类。此功能块的主要目的是记录一系列的浮动数据值,并将其存储在一个数组中。

1.2  变量定义

输入变量(VAR_INPUT)

request:这是一个布尔型变量,作为请求标志。当该变量的值从 FALSE 变为 TRUE 时,即检测到上升沿,功能块会触发数据记录操作。

value:这是一个实型变量,代表需要存储的浮动数据值。每次触发数据记录时,该变量的值会被存储到数组中。

输出变量(VAR_OUTPUT)

store:这是一个长度为 11 的实型数组,用于存储最多 10 个数据值。数组的索引范围是从 0 到 10。

内部变量(VAR)

index:这是一个整型变量,作为当前存储数据的位置索引。它指示了下一个数据应该存储在数组中的哪个位置。

rise:这是一个布尔型变量,用于检测 request 变量的上升沿。当检测到上升沿时,该变量的值为 TRUE。

riseHF:这是一个布尔型变量,用于存储上一个请求状态。通过比较当前请求状态和上一个请求状态,可以判断是否发生了上升沿。

2  程序逻辑

上升沿检测

#rise := #request AND NOT #riseHF;
#riseHF := #request;

这两行代码实现了上升沿检测的功能。#rise 的值取决于当前 request 的值和上一个 request 的值。只有当当前 request 为 TRUE 且上一个 request 为 FALSE 时,#rise 才会被置为 TRUE,表示检测到了上升沿。同时,#riseHF 会更新为当前 request 的值,以便下一次检测。

数据存储

IF #rise THEN    
    #store[#index] := #value;    
    IF #index < 10 THEN       
        #index += 1;   
    ELSE       
        #index := 0;    
    END_IF;
END_IF;

当检测到上升沿时,会执行数据存储操作。当前输入的 value 会被存储到 store 数组中,存储位置由 index 变量指定。如果 index 小于 10,说明存储空间未满,index 会加 1,准备存储下一个值;如果 index 达到了 10,说明存储空间已满,index 会被重置为 0,实现循环使用存储空间。

3  应用场景

3.1 工业生产过程监测

在工业生产线上,许多参数需要实时监测,如温度、压力、流量等。通过使用 “PM_Data_Recording” 功能块,可以定期记录这些参数的值。例如,在一个化工生产过程中,每隔一段时间发送一个 request 信号,将当前的温度值作为 value 输入到功能块中。这样,就可以将一段时间内的温度数据存储在数组中,方便后续分析生产过程的稳定性和安全性。

3.2  设备故障诊断

对于一些关键设备,如电机、泵等,其运行状态的监测至关重要。通过记录设备的运行参数,如电流、电压、转速等,可以在设备出现故障时,分析历史数据,找出故障发生的原因。例如,当电机出现异常时,可以查看之前记录的电流值,判断是否是由于电流过大导致的故障。

3.3  质量控制

在产品生产过程中,质量控制是关键环节。通过记录产品的关键质量参数,如尺寸、重量、硬度等,可以对产品质量进行实时监控。如果发现某个产品的质量参数超出了正常范围,可以查看之前记录的数据,分析是否是生产过程中的某个环节出现了问题。

拓展思考

4.1 增加存储容量

当前的功能块只能存储 10 个数据值,在某些应用场景下可能不够。可以通过修改数组的长度来增加存储容量。例如,将 store 数组的长度改为 100,这样就可以存储更多的数据。同时,需要相应地修改 index 的判断条件,确保索引不会超出数组的范围。

4.2 增加数据处理功能

除了简单的数据存储,还可以在功能块中增加数据处理功能。例如,计算存储数据的最大值、最小值等统计信息。可以在功能块中添加新的变量来存储这些统计信息,并在每次存储数据时进行更新。以下是一个简单的示例代码:

FUNCTION_BLOCK "PM_Data_Recording_Extended"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1

  VAR_INPUT       
      request : Bool;      
      value : Real;   
   END_VAR

  VAR_OUTPUT       
      store : Array[0..99] of Real;      
      maxValue : Real; // 最大值     
      minValue : Real; // 最小值   
   END_VAR

  VAR       
      index : Int;      
      rise : Bool;      
      riseHF : Bool;   
   END_VAR

BEGIN    
    #rise := #request AND NOT #riseHF;   
    #riseHF := #request;

    IF #rise THEN        
        #store[#index] := #value;        
        IF #index = 0 THEN            
            #maxValue := #value;            
            #minValue := #value;        
        ELSE            
            IF #value > #maxValue THEN               
                #maxValue := #value;            
            END_IF;           
             IF #value < #minValue THEN                
                  #minValue := #value;           
              END_IF;       
         END_IF;       
          IF #index < 99 THEN           
               #index += 1;       
           ELSE           
                #index := 0;        
            END_IF;    
    END_IF;
END_FUNCTION_BLOCK

4.3  储存更多的信息

在实际应用中,可能需要一次储存更多的数据信息,可以利用 PLC 编程软件中的自建数据类型或结构体来实现。

首先新建数据类型

TYPE "CubeData"
VERSION : 0.1   
   STRUCT      
      length : Real;     
      width : Real;      
      height : Real;   
   END_STRUCT;

END_TYPE

将 store : Array[0..10] of Real;

改为store : Array[0..10] of CubeData;

这样在一次触发后就可以同时记录立方体的长宽高信息。

结论

我们编写的“PM_Data_Recording” 功能块是一个简单而实用的 PLC 程序,它可以帮助我们记录和存储工业过程中的数据。通过深入理解其原理和应用场景,我们可以根据实际需求对其进行改进和优化,使其更好地满足工业自动化的需求。在未来的工业发展中,数据记录和分析将变得越来越重要,PLC 工程师需要不断学习和创新,开发出更加高效、智能的程序。

往期回顾

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

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

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

图片

2025年04月