1FUNCTION_BLOCK"FB_Min_Demo"2{ S7_Optimized_Access :='TRUE' }3VERSION:0.14VAR_INPUT5 A :Int:=3;6 B :Int:=1;7 C :Int:=2;8END_VAR910VAR_OUTPUT11 Result :Int;// 最小值12END_VAR1314BEGIN15REGION 取最小值16#Result:= MIN(IN1 :=#A, IN2 :=#B, IN3 :=#C);17END_REGION18END_FUNCTION_BLOCK19
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1#Result:= MIN(IN1 :=#A, IN2 :=#B, IN3 :=#C);
两个输入时可以省略 IN3:
SCL
1#Lower:= MIN(IN1 :=#LimitA, IN2 :=#LimitB);
怎么工作
输入
结果
3, 1, 2
1
-1, -5, -3
-5
2.5, 1.5(REAL)
1.5
输入个数 2..32,编号 IN1..INn 必须连续。
返回类型跟随输入;所有输入类型要兼容。
支持整数、浮点、TIME、DATE、DT;TIME 比较的是时间长度。
和 MAX 相反;和 LIMIT 不同,MIN 不夹值,只取最小。
常用场景
1. 取多个候选值的最小值
多个传感器/多个配方限值取最小,作为安全上限;避免某一个候选值过大。
2. 计算可用空间
多个料仓剩余空间取最小,决定还能放多少;再配合 LIMIT 做下限保护。
3. 时间/日期比较
多个时间戳取最早;MIN 支持 TIME/DATE/DT,但类型要一致。
常见坑
输入少于 2 个:MIN(IN1 := #A) 不是合法用法;至少两个输入。
编号不连续:IN1、IN3 跳号会编译报错;按顺序写。
类型不一致:Int 和 Real 混用可能报错;先统一类型。
把 MIN 当限幅:MIN 只取最小,不限制范围;限幅用 LIMIT。
负数/浮点边界:比较规则正常,但 NaN 会让结果无效;传感器故障要单独处理。
超过 32 个输入:拆分多次调用,或先用数组 + 循环。
和 LAD 的区别
LAD 的 MIN 盒可以增加多个输入;SCL 里直接写 MIN(IN1 := ..., IN2 := ...),参数个数由调用决定。语义一样,SCL 更容易和表达式组合。梯形图版本见 Learn-LAD 的 MIN 页。