auto2023 发表于 2023-4-21 23:40:56

用SCL写一个备用自投的程序

1.该程序能在博途中运行;
2.该程序是一个函数块;
3.能实现7台电机的5用2备功能;

chatGPT_小智 发表于 2023-4-21 23:42:19

请参考以下备用自投程序:

FUNCTION_BLOCK FB_RedundantStart
TITLE = 'Redundant Start Block'
VERSION : INT := 1;

VAR_INPUT
    Enable : BOOL;                        (* 主控制开关 *)
    Motor1_Start : BOOL;                  (* 电机1启动信号 *)
    Motor2_Start : BOOL;                  (* 电机2启动信号 *)
    Motor3_Start : BOOL;                  (* 电机3启动信号 *)
    Motor4_Start : BOOL;                  (* 电机4启动信号 *)
    Motor5_Start : BOOL;                  (* 电机5启动信号 *)
    Motor6_Start : BOOL;                  (* 电机6启动信号 *)
    Motor7_Start : BOOL;                  (* 电机7启动信号 *)
END_VAR

VAR_OUTPUT
    Motor1_Run : BOOL;                      (* 电机1运行信号 *)
    Motor2_Run : BOOL;                      (* 电机2运行信号 *)
    Motor3_Run : BOOL;                      (* 电机3运行信号 *)
    Motor4_Run : BOOL;                      (* 电机4运行信号 *)
    Motor5_Run : BOOL;                      (* 电机5运行信号 *)
    Motor6_Run : BOOL;                      (* 电机6运行信号 *)
    Motor7_Run : BOOL;                      (* 电机7运行信号 *)
END_VAR

VAR_TEMP
    All_Run : BOOL;                         (* 所有电机运行标志 *)
    Running_Count : INT := 0;               (* 运行的电机数量 *)
    Is_Run : ARRAY OF BOOL := ;    (* 每个电机的运行标志 *)
    i : INT;                              (* 循环计数器 *)
END_VAR

BEGIN
(* 检查主控制开关是否打开 *)
IF Enable THEN
    (* 检查每个电机启动信号 *)
    IF Motor1_Start THEN
      Is_Run := TRUE;
    END_IF
    IF Motor2_Start THEN
      Is_Run := TRUE;
    END_IF
    IF Motor3_Start THEN
      Is_Run := TRUE;
    END_IF
    IF Motor4_Start THEN
      Is_Run := TRUE;
    END_IF
    IF Motor5_Start THEN
      Is_Run := TRUE;
    END_IF
    IF Motor6_Start THEN
      Is_Run := TRUE;
    END_IF
    IF Motor7_Start THEN
      Is_Run := TRUE;
    END_IF

    (* 计算正在运行的电机数量 *)
    Running_Count := 0;
    FOR i:=1 TO 7 DO
      Running_Count := Running_Count + INT_TO_BOOL(Is_Run);
    END_FOR

    (* 判断是否需要备用自投 *)
    IF Running_Count > 5 THEN
      All_Run := FALSE;
      IF Is_Run THEN
            Is_Run := FALSE;
      ELSIF Is_Run THEN
            Is_Run := FALSE;
      ELSIF Is_Run THEN
            Is_Run := FALSE;
      ELSIF Is_Run THEN
            Is_Run := FALSE;
      ELSIF Is_Run THEN
            Is_Run := FALSE;
      ELSIF Is_Run THEN
            Is_Run := FALSE;
      ELSE
            Is_Run := FALSE;
      END_IF
    END_IF

    (* 设置每个电机的运行标志 *)
    Motor1_Run := Is_Run;
    Motor2_Run := Is_Run;
    Motor3_Run := Is_Run;
    Motor4_Run := Is_Run;
    Motor5_Run := Is_Run;
    Motor6_Run := Is_Run;
    Motor7_Run := Is_Run;
ELSE
    (* 主控制开关未打开,所有电机关闭 *)
    Motor1_Run := FALSE;
    Motor2_Run := FALSE;
    Motor3_Run := FALSE;
    Motor4_Run := FALSE;
    Motor5_Run := FALSE;
    Motor6_Run := FALSE;
    Motor7_Run := FALSE;
END_IF;

END_FUNCTION_BLOCK

该函数块可以实现7台电机的5用2备功能。输入参数中,Enable为主控制开关,Motor1_Start到Motor7_Start为对应的电机启动信号;输出参数中,Motor1_Run到Motor7_Run为对应的电机运行信号。当启动的电机数量超过5台时,程序会自动关闭一个正在运行的电机。当主控制开关未打开时,所有电机都会关闭。

auto2023 发表于 2023-4-21 23:44:40

未实现5台运行电机中有一台故障停下来了,去启动备用的电机的功能

chatGPT_小智 发表于 2023-4-21 23:45:57

auto2023 发表于 2023-04-21 23:44
未实现5台运行电机中有一台故障停下来了,去启动备用 ...

请参考以下更新的备用自投程序:FUNCTION_BLOCK FB_RedundantStartTITLE = 'Redundant Start Block'VERSION : INT := 2;VAR_INPUT    Enable : BOOL;                        (* 主控制开关 *)    Motor1_Start : BOOL;                  (* 电机1启动信号 *)    Motor2_Start : BOOL;                  (* 电机2启动信号 *)    Motor3_Start : BOOL;                  (* 电机3启动信号 *)    Motor4_Start : BOOL;                  (* 电机4启动信号 *)    Motor5_Start : BOOL;                  (* 电机5启动信号 *)    Motor6_Start : BOOL;                  (* 电机6启动信号 *)    Motor7_Start : BOOL;                  (* 电机7启动信号 *)END_VARVAR_OUTPUT    Motor1_Run : BOOL;                      (* 电机1运行信号 *)    Motor2_Run : BOOL;                      (* 电机2运行信号 *)    Motor3_Run : BOOL;                      (* 电机3运行信号 *)    Motor4_Run : BOOL;                      (* 电机4运行信号 *)    Motor5_Run : BOOL;                      (* 电机5运行信号 *)    Motor6_Run : BOOL;                      (* 电机6运行信号 *)    Motor7_Run : BOOL;                      (* 电机7运行信号 *)END_VARVAR_TEMP    All_Run : BOOL;                         (* 所有电机运行标志 *)    Running_Count : INT := 0;               (* 运行的电机数量 *)    Is_Run : ARRAY OF BOOL := FALSE;(* 每个电机的运行标志 *)    i, stop_motor : INT;                   (* 循环计数器,停止运行的电机编号 *)BEGIN(* 检查主控制开关是否打开 *)IF Enable THEN    (* 检查每个电机启动信号 *)    IF Motor1_Start THEN      Is_Run := TRUE;    END_IF    IF Motor2_Start THEN      Is_Run := TRUE;    END_IF    IF Motor3_Start THEN      Is_Run := TRUE;    END_IF    IF Motor4_Start THEN      Is_Run := TRUE;    END_IF    IF Motor5_Start THEN      Is_Run := TRUE;    END_IF    IF Motor6_Start THEN      Is_Run := TRUE;    END_IF    IF Motor7_Start THEN      Is_Run := TRUE;    END_IF    (* 计算正在运行的电机数量 *)    Running_Count := 0;    FOR i:=1 TO 7 DO      Running_Count := Running_Count + INT_TO_BOOL(Is_Run);    END_FOR    (* 判断是否需要备用自投 *)    IF Running_Count > 5 THEN      All_Run := FALSE;      stop_motor := 0;      (* 找出第一个故障的电机 *)      FOR i:=1 TO 5 DO            IF NOT Is_Run THEN                stop_motor := i;                EXIT;            END_IF      END_FOR      (* 如果有故障电机,则使用备用电机替代其运行 *)      IF stop_motor > 0 THEN            Is_Run := TRUE;      END_IF    ELSE      All_Run := TRUE;    END_IF    (* 设置每个电机的运行标志 *)    Motor1_Run := Is_Run;    Motor2_Run := Is_Run;    Motor3_Run := Is_Run;    Motor4_Run := Is_Run;    Motor5_Run := Is_Run;    Motor6_Run := Is_Run;    Motor7_Run := Is_Run;ELSE    (* 主控制开关未打开,所有电机关闭 *)    Motor1_Run := FALSE;    Motor2_Run := FALSE;    Motor3_Run := FALSE;    Motor4_Run := FALSE;    Motor5_Run := FALSE;    Motor6_Run := FALSE;    Motor7_Run := FALSE;END_IF;END_FUNCTION_BLOCK在更新的程序中,如果5台运行电机中有一台停下来,则程序会尝试使用备用电机替代其运行。如果主控制开关未打开,所有电机都会关闭。
页: [1]
查看完整版本: 用SCL写一个备用自投的程序