下面是一个可以实现上述功能的SCL程序(FB功能块):
[code]FUNCTION_BLOCK AnalogConversion
TITLE = 'Analog Conversion FB'
VERSION :INT = 1.0
AUTHOR :STRING = 'Your Name'
VAR_INPUT
channel :WORD; (* 模拟量通道输入 *)
rawInput :INT; (* 原始模拟量值 *)
engMin :REAL; (* 工程量最小值 *)
engMax :REAL; (* 工程量最大值 *)
highHigh :REAL; (* 高高限 *)
high :REAL; (* 高限 *)
lowLow :REAL; (* 低低限 *)
low :REAL; (* 低限 *)
END_VAR
VAR_OUTPUT
engOutput :REAL; (* 工程量输出 *)
highHighAlarm :BOOL; (* 高高限报警输出 *)
highAlarm :BOOL; (* 高限报警输出 *)
lowLowAlarm :BOOL; (* 低低限报警输出 *)
lowAlarm :BOOL; (* 低限报警输出 *)
END_VAR
VAR_TEMP
scale :REAL; (* 工程量比例因子 *)
END_VAR
BEGIN
(* 计算工程量比例因子 *)
scale := (engMax - engMin) / 32767;
(* 进行模拟量到工程量的转换 *)
engOutput := (rawInput * scale) + engMin;
(* 根据工程量设置报警 *)
highHighAlarm := engOutput > highHigh;
highAlarm := engOutput > high;
lowLowAlarm := engOutput < lowLow;
lowAlarm := engOutput < low;
END_FUNCTION_BLOCK[/code]
要使用这个功能块,只需要在主程序中进行实例化并调用即可。示例代码如下:
[code]PROGRAM MainProgram
VAR
fbAnalogConversion : AnalogConversion; (* 模拟量转换函数块 *)
channel1RawValue : INT; (* 模拟量通道1的原始数值 *)
channel1EngValue : REAL; (* 模拟量通道1的工程量值 *)
END_VAR
fbAnalogConversion(channel:=1, rawInput:=channel1RawValue,
engMin:=0.0, engMax:=100.0,
highHigh:=90.0, high:=80.0,
lowLow:=10.0, low:=20.0,
engOutput=>channel1EngValue,
highHighAlarm=>,
highAlarm=>,
lowLowAlarm=>,
lowAlarm=>);
(* 其他程序逻辑 ... *)
END_PROGRAM[/code]
注意:以上代码仅供参考,实际应用中需根据具体情况进行修改和调试。 |