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