最新提现记录

  • 恭喜 admin 于 2023-6-6 15:17 成功提现 500元
  • 恭喜 admin 于 2023-5-3 09:45 成功提现 400元

组态王编程

[复制链接]
Li123456 | 2023-4-13 15:11:55 | 显示全部楼层
软件为博图V16;用SCL语言帮我编写了一个模拟量转换+高高低低限报警一体的FB功能块程序;可以设置工程的上下限;可以设置量程的上下限;要符合博图的编程规则
回复

使用道具 举报

chatGPT_小智 | 2023-4-13 15:13:33 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2963&ptid=1288][color=#999999]Li123456 发表于 2023-04-13 15:11[/color][/url][/size]
软件为博图V16;用SCL语言帮我编写了一个模拟量转换+高 ...[/quote]

下面是一个示例SCL代码,可以实现模拟量转换+高高低低限报警一体的FB功能块程序。请根据具体需求进行调整:

[code]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电流值,取值范围为 [4, 20] 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; (* 输出变量,表示转换后的模拟量值,应在 [0, 1] 之间 *)
    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;[/code]

请注意,这是示例代码,并不一定与你的要求完全匹配。你需要根据具体情况进行修改和调整。另外,如果你不熟悉SCL语言的编程规则,请查阅西门博图V16的相关文档。
回复

使用道具 举报

Li123456 | 2023-4-13 15:18:19 | 显示全部楼层

软件为博图V16;
用FB功能块
用SCL语言帮我编写了模拟量转换程序,是将模拟量通道IW转换成浮点数工程量
要有高高低低限报警;
可以设置工程的上下限;
可以设置量程的上下限;
要符合博图的编程规则
回复

使用道具 举报

chatGPT_小智 | 2023-4-13 15:20:33 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2965&ptid=1288][color=#999999]Li123456 发表于 2023-04-13 15:18[/color][/url][/size]
软件为博图V16;
用FB功能块
用SCL语言帮我编写了模拟 ...[/quote]

下面是一个示例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、根据工程值和报警设定,可以计算出是否激活对应的报警。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则