PLC 数组处理难?看这一篇就够了-CODESYS资源下载区-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

HSC6490-cn中国制造,中国芯~
查看: 1160|回复: 0

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

[复制链接]
  • TA的每日心情
    擦汗
    2019-8-13 14:13
  • 签到天数: 32 天

    [LV.5]常住居民I

    发表于 2024-11-15 21:28:31 | 显示全部楼层 |阅读模式
    引言在现代工业自动化中,数据处理能力的提升是提高效率和可靠性的重要途径。本文将介绍一个用于数组处理的功能块 PM_ArrayProcessing_v2,它能够执行多种数据分析任务,如排序、最大值、最小值、平均值和中位值的计算。程序使用 ST 语言编写,方便大家移植到自己使用的 PLC 品牌。

    本文并没有深入介绍每个功能的实现方法,只提供了代码及部分解释,有兴趣的可以根据代码深入研究一下。程序代码的使用 ST 语言编写,大部分品牌 PLC 都支持 ST 语言,方便大家移植到自己使用的 PLC 品牌。

    1   程序设计思路
    该功能块通过多个按钮触发不同的操作,主要包括:排序:能够对输入的数组进行从小到大或从大到小的排序。最大值和最小值:快速找出数组中的最大值和最小值。平均值:计算数组的平均值。中位值:找到数组的中位值,并处理奇数和偶数长度的情况。通过这些功能,用户可以方便地对数组进行全面分析。
    2   程序代码
    [AppleScript] 纯文本查看 复制代码
    FUNCTION_BLOCK PM_ArrayProcessing_v2
    VAR_INPUT
        SortAscBtn : BOOL;
        SortDescBtn : BOOL;
        MaxBtn : BOOL;
        MinBtn : BOOL;
        AvgBtn : BOOL;
        MedianBtn : BOOL;
        InputArray : ARRAY[1..11] OF REAL;
    END_VAR
    VAR_OUTPUT
        SortedAscArray : ARRAY[1..11] OF REAL;
        SortedDescArray : ARRAY[1..11] OF REAL;
        MaxValue : REAL;
        MinValue : REAL;
        AvgValue : REAL;
        MedianValue : REAL;
    END_VAR
    VAR
        TempArray : ARRAY[1..11] 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[j] THEN 
                    Temp := TempArray;
                    TempArray := TempArray[j];
                    TempArray[j] := Temp; 
               END_IF 
           END_FOR 
       END_FOR
        FOR I := 1 TO UINT_TO_INT(ArrayLength) DO 
           SortedAscArray[I] := TempArray[I]; 
       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[I] < TempArray[J] THEN
                    Temp := TempArray[I];
                    TempArray[I] := TempArray[J];
                    TempArray[J] := Temp; 
               END_IF 
           END_FOR
        END_FOR
        FOR I := 1 TO UINT_TO_INT(ArrayLength) DO 
           SortedDescArray[I] := TempArray[I];
        END_FOR
    END_IF
    
    IF MaxBtn THEN 
       MaxValue := InputArray[1]; 
       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[1];
        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[I] > TempArray[J] THEN 
                    Temp := TempArray[I];
                    TempArray[I] := TempArray[J];
                    TempArray[J] := Temp;
                END_IF 
           END_FOR 
       END_FOR 
       IF UINT_TO_INT(ArrayLength) MOD 2 = 0 THEN
            MedianValue := (TempArray[UINT_TO_INT(ArrayLength) / 2] + TempArray[UINT_TO_INT(ArrayLength) / 2 + 1]) / 2;
        ELSE 
           MedianValue := TempArray[UINT_TO_INT(ArrayLength) / 2 + 1];
        END_IF
    END_IF

    3   代码解释
    (1)输入与输出:输入包括一个长度为 11 的数组和若干控制按钮,输出则是处理后的数组或计算值。(可根据需求修改数组大小,程序中所有的数组变量都需要修改)
    (2)排序功能:使用简单的冒泡排序法实现排序功能。
    (3)最大值和最小值:通过遍历数组实现。
    (4)平均值:累加数组元素后除以数组长度。
    (5)中位值:先排序,再根据数组长度判断取中间值或中间两个值的平均。
    (6)拓展:用户可以根据自己的情况,只需要简单地修改程序就可以实现不同数组大小的数组分析。程序运行展示
    85f55c82bcc5c8b2558110629b5093eb.png
    输入

    0b741db19c8dbce46433cb331201e7fe.png
    输出
    4   应用场景

    该功能块适用于工业自动化设备的实时数据处理,如生产线传感器数据的分析、质量控制中的数据筛选等。
    5   开源版本说明

    该程序遵循开源原则,任何人都可以使用、修改和分发此代码。在使用前应进行充分的测试,修改代码时,请秉持分享精神,将您的改进和成果进行分享,以便更多人受益。

    总结

    通过 PM_ArrayProcessing_v2 功能块,用户可以高效地处理和分析数据。其设计简单易懂,适合快速集成到各种工业控制系统中,极大地提高了数据处理的自动化程度和效率。

    +10
    不赞一个?
    打赏鼓励一下!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    
    顶部qrcode底部
    关注酷德网订阅号,获取更多资讯!

    QQ|Archiver|手机版|小黑屋|酷德论坛 ( 苏ICP备16065247号-1 )|网站地图

    GMT+8, 2026-11-9 03:46 , Processed in 0.341484 second(s), 50 queries .

    酷德网

    © 2001-2013 Hicodesys. 技术支持 by 酷德网

    快速回复 返回顶部 返回列表