软件为博图V16;用SCL语言帮我编写了一个模拟量转换+高 ...
下面是一个示例SCL代码,可以实现模拟量转换+高高低低限报警一体的FB功能块程序。请根据具体需求进行调整:
FUNCTION_BLOCK FB_ANA_ALARM
TITLE = "Ana conversion with alarm (4-20mA)"
VERSION : INT = 1.0
AUTHOR : STRING = "Your Name"
FAMILY : STRING = "Custom Function Blocks"
RETAIN
VAR_INPUT
i_ana_in : REAL; (* 输入变量,表示输入的4-20mA电流值,取值范围为 mA *)
i_lower_limit : REAL; (* 输入变量,表示要监控的下限,取值范围与 i_ana_range 相同 *)
i_upper_limit : REAL; (* 输入变量,表示要监控的上限,取值范围与 i_ana_range 相同 *)
i_ana_range : REAL; (* 输入变量,表示量程(最大值减最小值),即20mA电流对应的物理量的最大值与4mA对应的最小值之差 *)
i_phy_min : REAL; (* 输入变量,表示20mA对应的物理量的最小值 *)
RETAIN
VAR_OUTPUT
o_ana_out : REAL; (* 输出变量,表示转换后的模拟量值,应在 之间 *)
o_alarm : BOOL; (* 输出变量,表示是否触发了报警,TRUE 表示已触发,FALSE 表示未触发 *)
RETAIN
VAR
v_range_scale : REAL; (* 局部变量,表示将输入的 i_ana_in 从 4-20mA 转换为 0-1 的比例系数 *)
v_phy_val : REAL; (* 局部变量,表示 i_ana_in 对应的物理量值 *)
v_ana_alarm_l_lmt : REAL; (*局部变量,表示高高限报警阈值*)
v_ana_alarm_h_lmt : REAL; (*局部变量,表示高低限报警阈值*)
v_ana_alarm_h_hlmt: REAL; (*局部变量,表示低低限报警阈值*)
END_VAR
(* 计算范围比例因子 *)
v_range_scale := 1 / i_ana_range;
(* 将 4-20mA 转换为物理量值 *)
v_phy_val := (i_ana_in - 4) * v_range_scale + i_phy_min;
(* 将物理量值转换为 0-1 范围内的模拟量值 *)
o_ana_out := (v_phy_val - i_phy_min) / i_ana_range;
(* 判断当前是否触发了报警 *)
v_ana_alarm_l_lmt:=i_lower_limit+0.05*i_ana_range;
v_ana_alarm_h_lmt:=i_upper_limit-0.05*i_ana_range;
v_ana_alarm_h_hlmt:=i_lower_limit-0.05*i_ana_range;
IF (v_phy_val < v_ana_alarm_h_hlmt OR v_phy_val > i_upper_limit) THEN
o_alarm := TRUE; (* 低低限或高限报警 *)
ELSIF (v_phy_val < i_lower_limit OR v_phy_val > v_ana_alarm_h_lmt) THEN
o_alarm := TRUE; (* 低限或高低限报警 *)
ELSE
o_alarm := FALSE; (* 未触发报警 *)
END_IF;
请注意,这是示例代码,并不一定与你的要求完全匹配。你需要根据具体情况进行修改和调整。另外,如果你不熟悉SCL语言的编程规则,请查阅西门博图V16的相关文档。
软件为博图V16;
用FB功能块
用SCL语言帮我编写了模拟量转换程序,是将模拟量通道IW转换成浮点数工程量
要有高高低低限报警;
可以设置工程的上下限;
可以设置量程的上下限;
要符合博图的编程规则 Li123456 发表于 2023-04-13 15:18
软件为博图V16;
用FB功能块
用SCL语言帮我编写了模拟 ...
下面是一个示例SCL代码,可以实现模拟量转换+高高低低限报警的FB功能块程序。请根据具体需求进行调整:
FUNCTION_BLOCK FB_ANA_ALARM
TITLE = 'Analog conversion with High/High-Low/Low alarm'
VERSION : INT = 1.0
AUTHOR : 'Your name'
FAMILY : 'Custom Function Blocks'
VAR_INPUT
// 4-20mA analog channel
IW_AnalogChannel : WORD;
// Engineering units range
R_Range_EngMin : REAL := 0.0; // Minimum engineering value (default is 0.0)
R_Range_EngMax : REAL := 100.0; // Maximum engineering value (default is 100.0)
// Measurement range
R_Range_MeasMin : REAL := 0.0; // Minimum measurement value (default is 0.0)
R_Range_MeasMax : REAL := 65535.0; // Maximum measurement value (default is 65535.0)
// Low and High Alarms
R_AlarmLow : REAL := 25.0; // Low Alarm (default is 25.0)
R_AlarmHigh : REAL := 75.0; // High Alarm (default is 75.0)
// Deadband
R_Deadband : REAL := 5.0; // Deadband for alarms (default is 5.0)
END_VAR
VAR_OUTPUT
// Engineering value
R_EngValue : REAL;
// Alarm states
B_AlarmLowActive : BOOL;
B_AlarmHighActive : BOOL;
END_VAR
VAR
// Internal variables
R_Range_MeasTotal : REAL := ABS(R_Range_MeasMax - R_Range_MeasMin);
R_Range_EngTotal : REAL := ABS(R_Range_EngMax - R_Range_EngMin);
R_AlarmLowValue : REAL := (R_AlarmLow / 100.0) * R_Range_EngTotal + R_Range_EngMin;
R_AlarmHighValue : REAL := (R_AlarmHigh / 100.0) * R_Range_EngTotal + R_Range_EngMin;
R_DeadbandValue : REAL := (R_Deadband / 100.0) * R_Range_EngTotal;
END_VAR
// Analog channel conversion
R_EngValue := ((IW_AnalogChannel - R_Range_MeasMin) / R_Range_MeasTotal) * R_Range_EngTotal + R_Range_EngMin;
// High and Low alarm activation
B_AlarmLowActive := R_EngValue < R_AlarmLowValue - R_DeadbandValue;
B_AlarmHighActive := R_EngValue > R_AlarmHighValue + R_DeadbandValue;
END_FUNCTION_BLOCK
说明:
1、该功能块的名称为“FB_ANA_ALARM”。
2、输入参数包括:
- IW_AnalogChannel:4-20mA模拟量信号通道。
- R_Range_EngMin:工程值的最小值。
- R_Range_EngMax:工程值的最大值。
- R_Range_MeasMin:测量范围的最小值。
- R_Range_MeasMax:测量范围的最大值。
- R_AlarmLow:低限报警的工程值(默认为25.0)。
- R_AlarmHigh:高限报警的工程值(默认为75.0)。
- R_Deadband:报警死区(默认为5.0)。
3、输出参数包括:
- R_EngValue:转换后的工程值。
- B_AlarmLowActive:低限报警的状态(TRUE代表激活)。
- B_AlarmHighActive:高限报警的状态(TRUE代表激活)。
4、该功能块还有一些内部变量,例如R_Range_EngTotal(工程值范围的总量),R_AlarmLowValue(低限报警值),R_AlarmHighValue(高限报警值)和R_DeadbandValue(报警死区的值)。
5、将模拟量信号通道IW转换成工程值是通过以下公式实现的:
R_EngValue := ((IW_AnalogChannel - R_Range_MeasMin) / R_Range_MeasTotal) * R_Range_EngTotal + R_Range_EngMin;
6、根据工程值和报警设定,可以计算出是否激活对应的报警。
页:
1
[2]