▎西门子博途 LGF 库详解 · 06:数学函数(中)——RandomRange、SearchMinMax、StoreMinMax
本篇是数学函数组的第二部分,共 7 个块。承接上一篇的基础随机数,这里扩展到指定范围的随机数生成,以及数组最值搜索和历史最值追踪。
一、7 个块一览
数学函数组(4.5,中部)
| 块名 | 类型 | 版本 | 一句话功能 |
|------|------|------|-----------|
| LGF_Random_UDInt | FC | V3.0.1 | 生成 UDInt 范围随机数 |
| LGF_RandomRange_DInt | FC | V3.0.1 | 在 [min, max] 区间生成 DInt 随机数 |
| LGF_RandomRange_Real | FC | V3.0.1 | 在 [min, max] 区间生成 Real 随机数 |
| LGF_SearchMinMax_DInt | FC | V3.0.2 | 搜索 DInt 数组中的最小/最大值及索引 |
| LGF_SearchMinMax_LReal | FC | V3.0.2 | 搜索 LReal 数组中的最小/最大值及索引 |
| LGF_SearchMinMax_UDInt | FC | V3.0.1 | 搜索 UDInt 数组中的最小/最大值及索引 |
| LGF_StoreMinMax | FB | V3.0.1 | 持续追踪历史最大/最小值 |
二、引脚详解
#### LGF_Random_UDInt
| 引脚 | 类型 | 方向 | 说明 |
| Ret_Val | UDInt | OUT | UDInt 范围内的随机数 |
| error | Bool | OUT | 错误标志 |
| status | Word | OUT | 状态码 |
| subfunctionStatus | Word | OUT | 子函数状态码 |
#### LGF_RandomRange_DInt
| 引脚 | 类型 | 方向 | 说明 |
| minValue | DInt | IN | 随机数范围下限(含) |
| maxValue | DInt | IN | 随机数范围上限(含) |
| Ret_Val | DInt | OUT | [minValue, maxValue] 内的随机整数 |
| error | Bool | OUT | 错误标志 |
| status | Word | OUT | 状态码 |
| subfunctionStatus | Word | OUT | 子函数状态码 |
#### LGF_RandomRange_Real
| 引脚 | 类型 | 方向 | 说明 |
| minValue | Real | IN | 随机数范围下限(含) |
| maxValue | Real | IN | 随机数范围上限(含) |
| Ret_Val | Real | OUT | [minValue, maxValue] 内的随机实数 |
| error | Bool | OUT | 错误标志 |
| status | Word | OUT | 状态码 |
| subfunctionStatus | Word | OUT | 子函数状态码 |
#### LGF_SearchMinMax_DInt / _LReal / _UDInt
三个变体接口完全一致,仅数组元素类型不同:
| 引脚 | 类型 | 方向 | 说明 |
| values | Array of X | INOUT | 要搜索的数组(可变长度,原地操作) |
| Ret_Val | Void | OUT | 无返回值(结果通过 OUT 参数返回) |
| minValue | 同数组元素 | OUT | 数组中的最小值 |
| minValueIndex | DInt | OUT | 最小值在数组中的索引(从 startIndex 算起,0-based) |
| maxValue | 同数组元素 | OUT | 数组中的最大值 |
| maxValueIndex | DInt | OUT | 最大值在数组中的索引(0-based) |
#### LGF_StoreMinMax
| 引脚 | 类型 | 方向 | 默认值 | 说明 |
| value | LReal | IN | 0.0 | 要与历史最值比较的值 |
| reset | Bool | IN | FALSE | TRUE 时清空历史记录重新开始 |
| minValue | LReal | OUT | — | 自首次调用或上次 reset 以来的最小值 |
| maxValue | LReal | OUT | — | 自首次调用或上次 reset 以来的最大值 |
三、实战案例
#### 案例 1:模拟温度传感器读数
在仿真环境中生成 20.0~30.0 之间的随机温度值:
RandomRange_Real 传感器仿真
simulatedTemp := LGF_RandomRange_Real(minValue := 20.0, maxValue := 30.0);
#### 案例 2:产线 OEE 数据周报
本周 7 天每天记录了设备利用率,要找最好和最差的一天:
SearchMinMax 找最佳/最差
用 SearchMinMax_UDInt 搜索 7 元素数组:
LGF_SearchMinMax_UDInt(values := weeklyOEE,
minValue => worstDay,
minValueIndex => worstIndex,
maxValue => bestDay,
maxValueIndex => bestIndex);
minValueIndex 注意事项
minValueIndex 和 maxValueIndex 的输出是相对于搜索起始索引的偏移(0-based),不是数组的绝对索引。如果数组声明为 Array[1..100],startIndex 设为 1,那么 minValueIndex=3 对应的实际数组索引是 1+3=4。不要直接把 minValueIndex 当数组下标用。
#### 案例 3:压机最大压力追踪
设备验收时需要确认压机在工作过程中从未超过 250MPa:
StoreMinMax 历史追踪
LGF_StoreMinMax(value := currentPressure, reset := testStarted,
maxValue => maxPressure, minValue => minPressure);
IF maxPressure <= 250.0 THEN acceptancePassed := TRUE; END_IF;
测试开始时 give reset 一个上升沿,StoreMinMax 清零历史。之后每个周期传入 currentPressure,FB 自动判断是否刷新 maxValue。测试结束时直接读 maxPressure——全程不需要自己写比较逻辑。
四、总结与下载
本篇的 LoadStoreMinMax 是工厂验收测试中的利器——追踪整个测试过程中的压力/温度/速度峰值,不需要写一行历史比较代码。SearchMinMax 的索引输出在数据分析场景中也远比自己写循环高效。
下载信息
| 项目 | 内容 |
|------|------|
| SIOS-ID | 109479728 |
| 下载地址 | 中文站:www.ad.siemens.com.cn/download/documentdetail_12471.html |
| 当前版本 | V5.1.1(数据以此版为准;全球站另有 V5.2.1) |
| 费用 | 完全免费 |
下篇预告:LGF 库详解 · 07——数学函数(下)。Integration 数值积分、IsValueInToleranceByTime 时间容差检测、以及数学函数组的收尾总结。
欢迎点赞、在看、转发。还没关注的,点右上角——系列还有 19 篇在路上。