无心飞扬 发表于 2024-9-6 09:04:40

数组处理难?看这一篇就够了

引言在现代工业自动化中,数据处理能力的提升是提高效率和可靠性的重要途径。本文将介绍一个用于数组处理的功能块 PM_ArrayProcessing_v2,它能够执行多种数据分析任务,如排序、最大值、最小值、平均值和中位值的计算。程序使用 ST 语言编写,方便大家移植到自己使用的 PLC 品牌。本文并没有深入介绍每个功能的实现方法,只提供了代码及部分解释,有兴趣的可以根据代码深入研究一下。程序代码的使用 ST 语言编写,大部分品牌 PLC 都支持 ST 语言,方便大家移植到自己使用的 PLC 品牌。1程序设计思路该功能块通过多个按钮触发不同的操作,主要包括:
[*]排序:能够对输入的数组进行从小到大或从大到小的排序。
[*]最大值和最小值:快速找出数组中的最大值和最小值。
[*]平均值:计算数组的平均值。
[*]中位值:找到数组的中位值,并处理奇数和偶数长度的情况。
通过这些功能,用户可以方便地对数组进行全面分析。2程序代码FUNCTION_BLOCK PM_ArrayProcessing_v2
VAR_INPUT
    SortAscBtn : BOOL;
    SortDescBtn : BOOL;
    MaxBtn : BOOL;
    MinBtn : BOOL;
    AvgBtn : BOOL;
    MedianBtn : BOOL;
    InputArray : ARRAY OF REAL;
END_VAR
VAR_OUTPUT
    SortedAscArray : ARRAY OF REAL;
    SortedDescArray : ARRAY OF REAL;
    MaxValue : REAL;
    MinValue : REAL;
    AvgValue : REAL;
    MedianValue : REAL;
END_VAR
VAR
    TempArray : ARRAY OF REAL;
    I, J : INT;
    Temp : REAL;
    Sum : REAL;
    ArrayLength : UINT;
END_VAR

(*
版本记录:
版本          日期          作者
V1         2024-3-21   工控老王
V2         2024-8-09   工控老王
*)

// 功能说明:
// 对数组进行处理,根据不同功能的按钮,输出排序(从小到大,从大到小)、最大值、最小值、平均值、中位值

ArrayLength := SIZEOF(InputArray) / 4;

FOR I := 1 TO UINT_TO_INT(ArrayLength) DO
    TempArray := InputArray;
END_FOR

IF SortAscBtn THEN
    FOR I := 1 TO UINT_TO_INT(ArrayLength) - 1 DO
      FOR J := I + 1 TO UINT_TO_INT(ArrayLength) DO
            IF TempArray > TempArray THEN
                Temp := TempArray;
                TempArray := TempArray;
                TempArray := Temp;
            END_IF
      END_FOR
    END_FOR
    FOR I := 1 TO UINT_TO_INT(ArrayLength) DO
      SortedAscArray := TempArray;
    END_FOR
END_IF

IF SortDescBtn THEN
    FOR I := 1 TO UINT_TO_INT(ArrayLength) - 1 DO
      FOR J := I + 1 TO UINT_TO_INT(ArrayLength) DO
            IF TempArray < TempArray THEN
                Temp := TempArray;
                TempArray := TempArray;
                TempArray := Temp;
            END_IF
      END_FOR
    END_FOR
    FOR I := 1 TO UINT_TO_INT(ArrayLength) DO
      SortedDescArray := TempArray;
    END_FOR
END_IF

IF MaxBtn THEN
    MaxValue := InputArray;
    FOR I := 2 TO UINT_TO_INT(ArrayLength) DO
      IF InputArray > MaxValue THEN
            MaxValue := InputArray;
      END_IF
    END_FOR
END_IF

IF MinBtn THEN
    MinValue := InputArray;
    FOR I := 2 TO UINT_TO_INT(ArrayLength) DO
      IF InputArray < MinValue THEN
            MinValue := InputArray;
      END_IF
    END_FOR
END_IF

IF AvgBtn THEN
    Sum := 0;
    FOR I := 1 TO UINT_TO_INT(ArrayLength) DO
      Sum := Sum + InputArray;
    END_FOR
    AvgValue := Sum / UINT_TO_INT(ArrayLength);
END_IF

IF MedianBtn THEN
    FOR I := 1 TO UINT_TO_INT(ArrayLength)-1 DO
      FOR J := I + 1 TO UINT_TO_INT(ArrayLength) DO
            IF TempArray > TempArray THEN
                Temp := TempArray;
                TempArray := TempArray;
                TempArray := Temp;
            END_IF
      END_FOR
    END_FOR
    IF UINT_TO_INT(ArrayLength) MOD 2 = 0 THEN
      MedianValue := (TempArray + TempArray) / 2;
    ELSE
      MedianValue := TempArray;
    END_IF
END_IF3代码解释
[*]输入与输出:输入包括一个长度为 11 的数组和若干控制按钮,输出则是处理后的数组或计算值。(可根据需求修改数组大小,程序中所有的数组变量都需要修改)
[*]排序功能:使用简单的冒泡排序法实现排序功能。
[*]最大值和最小值:通过遍历数组实现。
[*]平均值:累加数组元素后除以数组长度。
[*]中位值:先排序,再根据数组长度判断取中间值或中间两个值的平均。
[*]拓展:用户可以根据自己的情况,只需要简单地修改程序就可以实现不同数组大小的数组分析。
程序运行展示输入
输出
4应用场景该功能块适用于工业自动化设备的实时数据处理,如生产线传感器数据的分析、质量控制中的数据筛选等。5开源版本说明该程序遵循开源原则,任何人都可以使用、修改和分发此代码。在使用前应进行充分的测试,修改代码时,请秉持分享精神,将您的改进和成果进行分享,以便更多人受益。
总结通过 PM_ArrayProcessing_v2 功能块,用户可以高效地处理和分析数据。其设计简单易懂,适合快速集成到各种工业控制系统中,极大地提高了数据处理的自动化程度和效率。
页: [1]
查看完整版本: 数组处理难?看这一篇就够了