网站首页 > 技术文章 正文
引言
在现代工业自动化中,数据处理能力的提升是提高效率和可靠性的重要途径。本文将介绍一个用于数组处理的功能块 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[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
代码解释
输入与输出:输入包括一个长度为 11 的数组和若干控制按钮,输出则是处理后的数组或计算值。(可根据需求修改数组大小,程序中所有的数组变量都需要修改)排序功能:使用简单的冒泡排序法实现排序功能。最大值和最小值:通过遍历数组实现。平均值:累加数组元素后除以数组长度。中位值:先排序,再根据数组长度判断取中间值或中间两个值的平均。拓展:用户可以根据自己的情况,只需要简单地修改程序就可以实现不同数组大小的数组分析。
程序运行展示
输入
输出
4
应用场景
该功能块适用于工业自动化设备的实时数据处理,如生产线传感器数据的分析、质量控制中的数据筛选等。
5
开源版本说明
该程序遵循开源原则,任何人都可以使用、修改和分发此代码。在使用前应进行充分的测试,修改代码时,请秉持分享精神,将您的改进和成果进行分享,以便更多人受益。
总结
通过 PM_ArrayProcessing_v2 功能块,用户可以高效地处理和分析数据。其设计简单易懂,适合快速集成到各种工业控制系统中,极大地提高了数据处理的自动化程度和效率。
PLC 数组处理难?看这一篇就够了
http://bbs.plcjs.com/forum.php?mod=viewthread&tid=499829&fromuid=42656
(出处: PLC论坛-全力打造可编程控制器专业技术论坛)
猜你喜欢
- 2024-09-15 Scala学习六之数组和元组了解(scala 字符串数组)
- 2024-09-15 数据分析和机器学习框架底层工具NumPy的数组操作-索引和切片
- 2024-09-15 【Python数据分析系列】全面梳理数组维度转化和堆叠操作(案例)
- 2024-09-15 机器学习实战:Numpy多维数组的创建、索引与切片
- 2024-09-15 4小时的工作,1秒完成,中学体育比赛赛道汇总VBA数组字典进阶
- 2024-09-15 22.C# 多维数组(多维数组对象)
- 2024-09-15 VBA永远的神 3天工作1秒完成 20万行料号BOM表处理 数组字典案例
- 2024-09-15 C语言二维数组(c语言二维数组排序)
- 2024-09-15 Excel数据透视表、vlookup、数组公式、VBA自定义函数一对多查找
- 2024-09-15 程序大佬的秘密——C语言之数组二三事
- 1512℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 556℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 504℃MySQL service启动脚本浅析(r12笔记第59天)
- 482℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 480℃启用MySQL查询缓存(mysql8.0查询缓存)
- 460℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 440℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 438℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)