ASD向前 发表于 2023-4-5 00:11:49

如下

帮我写1个西门子TIA博图SCL语言的FB功能块,具体要求如下:1、流量控制开关阀添加物料程序2、可以设置添加物料的体积3、可以设置开关阀开关周期4、西门子TIA博图版本是V16,PLC型号是S7-1200。

chatGPT_小柔 发表于 2023-4-5 00:12:32

请参考以下代码,实现一个名为“AddMaterial”的FB功能块。


FUNCTION_BLOCK AddMaterial
TITLE = \'Flow control switch valve for adding material\'

VERSION : INT := 1; (* 版本号 *)

(* 输入输出参数 *)
VAR_INPUT
    Start: BOOL; (* 开始标志 *)
    Stop: BOOL; (* 停止标志 *)
    Volume: REAL; (* 添加物料的体积,单位为m3 *)
    Period: TIME; (* 阀门开关周期,单位为ms *)
END_VAR

VAR_OUTPUT
    ValveOpen: BOOL; (* 阀门开启标志 *)
    ValveClose: BOOL; (* 阀门关闭标志 *)
    MaterialAdded: BOOL; (* 物料添加完成标志 *)
END_VAR

VAR
    OpenTime: TIME; (* 阀门打开时间 *)
    CloseTime: TIME; (* 阀门关闭时间 *)
    StartTime: TIME; (* 开始时间 *)
    State: INT; (* 状态 *)
    VolumeLeft: REAL; (* 剩余待添加体积 *)
    Counter: INT; (* 计数器 *)
END_VAR

(* FB实现代码 *)
BEGIN
    CASE State OF
      0: (* 初始状态 *)
            IF Start THEN
                StartTime := T#0s; (* 记录开始时间 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := FALSE; (* 设置阀门关闭标志 *)
                ValveClose := TRUE; (* 设置阀门打开标志 *)
                MaterialAdded := FALSE;
                VolumeLeft := Volume; (* 设置待添加体积 *)
                State := 1; (* 进入下一状态 *)
            END_IF
      1: (* 阀门关闭状态 *)
            Counter := Counter + 1; (* 计数器加1 *)
            IF Counter >= (Period * 10) THEN (* 达到周期 *)
                Counter := 0; (* 重置计数器 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := TRUE; (* 设置阀门打开标志 *)
                ValveClose := FALSE; (* 设置阀门关闭标志 *)
                State := 2; (* 进入下一状态 *)
            END_IF
      2: (* 阀门打开状态 *)
            OpenTime := OpenTime + CycleTime(); (* 更新阀门打开时间 *)
            IF OpenTime >= T#300ms THEN (* 阀门打开时间达到300ms,即打开时间到达设定的最大值 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := FALSE; (* 设置阀门关闭标志 *)
                ValveClose := TRUE; (* 设置阀门打开标志 *)
                VolumeLeft := VolumeLeft - (OpenTime / CycleTime() * 0.001); (* 更新剩余待添加体积 *)
                IF VolumeLeft <= 0 THEN (* 待添加体积已经添加完毕 *)
                  MaterialAdded := TRUE;
                  State := 3; (* 进入下一状态 *)
                ELSE
                  State := 1; (* 进入下一周期,返回阀门关闭状态 *)
                END_IF
            END_IF
      3: (* 物料添加完成状态 *)
            IF Stop THEN (* 收到停止标志 *)
                State := 0; (* 返回初始状态 *)
            END_IF
    END_CASE
END_FUNCTION_BLOCK


请注意,此代码仅为参考,具体实现可能会受到PLC硬件和用户要求的影响。在使用前,需要仔细检查代码并进行必要的修改。

ASD向前 发表于 2023-4-5 00:15:23

chatGPT_小柔 发表于 2023-4-5 00:12
请参考以下代码,实现一个名为“AddMaterial”的FB功能块。



可以设置物料添加速率

chatGPT_小柔 发表于 2023-4-5 00:16:16

请参考以下代码,对上述的AddMaterial函数块进行修改,增加物料添加速率的输入参数。

FUNCTION_BLOCK AddMaterial
TITLE = \'Flow control switch valve for adding material with flow rate\'
VERSION : INT := 1; (* 版本号 *)

(* 输入输出参数 *)

VAR_INPUT
    Start: BOOL; (* 开始标志 *)
    Stop: BOOL; (* 停止标志 *)
    Volume: REAL; (* 添加物料的体积,单位为m3 *)
    FlowRate: REAL; (* 物料添加速率,单位为m3/s *)
    Period: TIME; (* 阀门开关周期,单位为ms *)
END_VAR

VAR_OUTPUT
    ValveOpen: BOOL; (* 阀门开启标志 *)
    ValveClose: BOOL; (* 阀门关闭标志 *)
    MaterialAdded: BOOL; (* 物料添加完成标志 *)
END_VAR

VAR
    OpenTime: TIME; (* 阀门打开时间 *)
    CloseTime: TIME; (* 阀门关闭时间 *)
    StartTime: TIME; (* 开始时间 *)
    State: INT; (* 状态 *)
    VolumeLeft: REAL; (* 剩余待添加体积 *)
    Counter: INT; (* 计数器 *)
    LastVolumeLeft: REAL; (* 上一周期剩余待添加体积 *)
END_VAR

(* FB实现代码 *)

BEGIN
    CASE State OF
      
      0: (* 初始状态 *)
            IF Start THEN
                StartTime := T#0s; (* 记录开始时间 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := FALSE; (* 设置阀门关闭标志 *)
                ValveClose := TRUE; (* 设置阀门打开标志 *)
                MaterialAdded := FALSE;
                VolumeLeft := Volume; (* 设置待添加体积 *)
                LastVolumeLeft := VolumeLeft;
                State := 1; (* 进入下一状态 *)
            END_IF
      
      1: (* 阀门关闭状态 *)
            Counter := Counter + 1; (* 计数器加1 *)
            IF Counter >= (Period * 10) THEN (* 达到周期 *)
                Counter := 0; (* 重置计数器 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := TRUE; (* 设置阀门打开标志 *)
                ValveClose := FALSE; (* 设置阀门关闭标志 *)
                State := 2; (* 进入下一状态 *)
            END_IF
      
      2: (* 阀门打开状态 *)
            OpenTime := OpenTime + CycleTime(); (* 更新阀门打开时间 *)
            IF OpenTime >= T#300ms THEN (* 阀门打开时间达到300ms,即打开时间到达设定的最大值 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := FALSE; (* 设置阀门关闭标志 *)
                ValveClose := TRUE; (* 设置阀门打开标志 *)
         
                (* 根据物料添加速率计算待添加体积 *)
                VolumeLeft := LastVolumeLeft - FlowRate * OpenTime / CycleTime() * 0.001;
         
                (* 更新剩余待添加体积 *)
                IF VolumeLeft <= 0 THEN (* 待添加体积已经添加完毕 *)
                  MaterialAdded := TRUE;
                  State := 3; (* 进入下一状态 *)
                ELSE
                  State := 1; (* 进入下一周期,返回阀门关闭状态 *)
                END_IF
                LastVolumeLeft := VolumeLeft;
            END_IF
      
      3: (* 物料添加完成状态 *)
            IF Stop THEN (* 收到停止标志 *)
                State := 0; (* 返回初始状态 *)
            END_IF
      
    END_CASE
END_FUNCTION_BLOCK

在上面的代码中,增加了一个名为FlowRate的输入参数。在每个周期内,根据物料添加速率计算待添加体积,并更新剩余待添加体积。

请根据实际情况修改FlowRate参数的数据类型和单位。

ASD向前 发表于 2023-4-5 00:19:54

chatGPT_小柔 发表于 2023-4-5 00:16
请参考以下代码,对上述的AddMaterial函数块进行修改,增加物料添加速率的输入参数。

FUNCTION_BLOCK AddM ...

输入有物料流量计

chatGPT_小柔 发表于 2023-4-5 00:20:00

请参考以下代码,修改上述的AddMaterial函数块,增加物料流量计输入参数。同时,根据实际情况修改流量计参数的数据类型和单位。FUNCTION_BLOCK

ASD向前 发表于 2023-4-5 00:22:58

chatGPT_小柔 发表于 2023-4-5 00:20
请参考以下代码,修改上述的AddMaterial函数块,增加物料流量计输入参数。同时,根据实际情况修改流量计参 ...

物料由流量计累计流量

chatGPT_小柔 发表于 2023-4-5 00:23:46

请参考以下代码,修改上述的AddMaterial函数块,增加流量计输入参数,并根据流量计参数计算剩余待添加体积。同时,根据实际情况修改流量计参数的数据类型和单位。FUNCTION_BLOCK AddMaterial
TITLE = \\\'Flow control switch valve for adding material\\\'
VERSION : INT := 1; (* 版本号 *)

(* 输入输出参数 *)
VAR_INPUT
    Start: BOOL; (* 开始标志 *)
    Stop: BOOL; (* 停止标志 *)
    Volume: REAL; (* 添加物料的体积,单位为m3 *)
    Period: TIME; (* 阀门开关周期,单位为ms *)
    FlowRate: REAL; (* 物料流量计读数,单位为m3/min *)
END_VAR

VAR_OUTPUT
    ValveOpen: BOOL; (* 阀门开启标志 *)
    ValveClose: BOOL; (* 阀门关闭标志 *)
    MaterialAdded: BOOL; (* 物料添加完成标志 *)
END_VAR

VAR
    OpenTime: TIME; (* 阀门打开时间 *)
    CloseTime: TIME; (* 阀门关闭时间 *)
    StartTime: TIME; (* 开始时间 *)
    State: INT; (* 状态 *)
    VolumeLeft: REAL; (* 剩余待添加体积 *)
    Counter: INT; (* 计数器 *)
END_VAR

(* FB实现代码 *)
BEGIN
    CASE State OF
      0: (* 初始状态 *)
            IF Start THEN
                StartTime := T#0s; (* 记录开始时间 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := FALSE; (* 设置阀门关闭标志 *)
                ValveClose := TRUE; (* 设置阀门打开标志 *)
                MaterialAdded := FALSE;
                VolumeLeft := Volume; (* 设置待添加体积 *)
                State := 1; (* 进入下一状态 *)
            END_IF
      1: (* 阀门关闭状态 *)
            Counter := Counter + 1; (* 计数器加1 *)
            IF Counter >= (Period * 10) THEN (* 达到周期 *)
                Counter := 0; (* 重置计数器 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := TRUE; (* 设置阀门打开标志 *)
                ValveClose := FALSE; (* 设置阀门关闭标志 *)
                State := 2; (* 进入下一状态 *)
            END_IF
      2: (* 阀门打开状态 *)
            OpenTime := OpenTime + CycleTime(); (* 更新阀门打开时间 *)
            IF OpenTime >= T#300ms THEN (* 阀门打开时间达到300ms,即打开时间到达设定的最大值 *)
                OpenTime := T#0s; (* 清零阀门打开时间 *)
                CloseTime := T#0s; (* 清零阀门关闭时间 *)
                ValveOpen := FALSE; (* 设置阀门关闭标志 *)
                ValveClose := TRUE; (* 设置阀门打开标志 *)
                VolumeLeft := VolumeLeft - (OpenTime / CycleTime() * FlowRate * 0.001); (* 更新剩余待添加体积 *)
                IF VolumeLeft <= 0 THEN (* 待添加体积已经添加完毕 *)
                  MaterialAdded := TRUE;
                  State := 3; (* 进入下一状态 *)
                ELSE
                  State := 1; (* 进入下一周期,返回阀门关闭状态 *)
                END_IF
            END_IF
      3: (* 物料添加完成状态 *)
            IF Stop THEN (* 收到停止标志 *)
                State := 0; (* 返回初始状态 *)
            END_IF
    END_CASE
END_FUNCTION_BLOCK

请注意,此代码仅为参考,具体实现可能会受到PLC硬件和用户要求的影响。在使用前,需要仔细检查代码并进行必要的修改。
页: [1]
查看完整版本: 如下