Yzy 发表于 2023-4-18 11:47:35

S71500利用SCL语言编写电机启停程序FB

1.手自动模式,运行状态,故障反馈,全开信号,全关信号,泄压故障,超温故障

chatGPT_小智 发表于 2023-4-18 11:49:05

以下是一个简单的 SCL 代码,实现了一个电机启停程序 FB,包括手自动模式、运行状态、故障反馈、全开信号、全关信号、泄压故障和超温故障:

FUNCTION_BLOCK Motor_Control_FB
TITLE = "Motor Control Function Block"

VERSION : UINT := 1;
// 版本号

(* 输入 *)

IN_MODE_AUTO : BOOL := FALSE;
// 手自动模式选择,TRUE 表示自动模式,FALSE 表示手动模式

IN_START_CMD : BOOL := FALSE;
// 启动命令输入,TRUE 表示启动

IN_STOP_CMD : BOOL := FALSE;
// 停止命令输入,TRUE 表示停止

IN_FULL_OPEN : BOOL := FALSE;
// 全开信号输入,TRUE 表示发生全开

IN_FULL_CLOSE : BOOL := FALSE;
// 全关信号输入,TRUE 表示发生全关

IN_PRESSURE_RELIEF_FAULT : BOOL := FALSE;
// 泄压故障信号输入,TRUE 表示发生泄压故障

IN_OVERHEATING_FAULT : BOOL := FALSE;
// 超温故障信号输入,TRUE 表示发生超温故障

(* 输出 *)

OUT_RUNNING : BOOL := FALSE;
// 运行状态输出,TRUE 表示正在运行

OUT_FAULT : BOOL := FALSE;
// 故障反馈输出,TRUE 表示发生故障

VAR
// 内部变量

STARTED : BOOL := FALSE;
// 记录是否已经启动

STOPPED : BOOL := FALSE;
// 记录是否已经停止

PRESSURE_RELIEFED : BOOL := FALSE;
// 记录是否已经泄压

OVERHEATED : BOOL := FALSE;
// 记录是否已经超温

END_VAR

// 依据输入和内部状态,控制电机启停、故障反馈等行为
ACTION
IF IN_MODE_AUTO THEN
    // 自动模式下,根据不同条件自动控制电机启动、停止、故障反馈等行为
    IF IN_START_CMD AND NOT STARTED THEN
      // 启动命令输入且未启动,开始启动
      STARTED := TRUE;
      OUT_RUNNING := TRUE;
    END_IF;

    IF IN_STOP_CMD AND NOT STOPPED THEN
      // 停止命令输入且未停止,开始停止
      STOPPED := TRUE;
      OUT_RUNNING := FALSE;
    END_IF;

    IF IN_FULL_OPEN OR IN_FULL_CLOSE THEN
      // 全开或全关信号输入,立即停止
      STOPPED := TRUE;
      OUT_RUNNING := FALSE;
    END_IF;

    IF IN_PRESSURE_RELIEF_FAULT AND NOT PRESSURE_RELIEFED THEN
      // 泄压故障信号输入,立即停止并输出故障
      STOPPED := TRUE;
      OUT_RUNNING := FALSE;
      OUT_FAULT := TRUE;
      PRESSURE_RELIEFED := TRUE;
    END_IF;

    IF IN_OVERHEATING_FAULT AND NOT OVERHEATED THEN
      // 超温故障信号输入,立即停止并输出故障
      STOPPED := TRUE;
      OUT_RUNNING := FALSE;
      OUT_FAULT := TRUE;
      OVERHEATED := TRUE;
    END_IF;

ELSE
    // 手动模式下,根据启动、停止命令控制电机启停
    IF IN_START_CMD THEN
      // 启动命令输入,开始启动
      OUT_RUNNING := TRUE;
    ELSEIF IN_STOP_CMD THEN
      // 停止命令输入,开始停止
      OUT_RUNNING := FALSE;
    END_IF;

    // 手动模式下无故障反馈输出
END_IF;

END_FUNCTION_BLOCK

该函数块接收多个输入信号,包括手自动模式选择、启动和停止命令、全开和全关信号、泄压故障和超温故障。根据不同的输入和内部状态(如已经启动或停止),控制电机的启停和故障反馈行为,最终输出运行状态和故障反馈信号。在自动模式下,还要处理全开、全关和故障等特殊情况。

Yzy 发表于 2023-4-18 12:32:01

增加一段报警复位

chatGPT_小智 发表于 2023-4-18 12:33:46

Yzy 发表于 2023-04-18 12:32
增加一段报警复位

以下是增加了报警复位功能的 SCL 代码:

FUNCTION_BLOCK Motor_Control_FBTITLE = "Motor Control Function Block"
VERSION : UINT := 1;// 版本号

(* 输入 *)
IN_MODE_AUTO            : BOOL := FALSE;// 手自动模式选择,TRUE 表示自动模式,FALSE 表示手动模式
IN_START_CMD            : BOOL := FALSE;// 启动命令输入,TRUE 表示启动
IN_STOP_CMD             : BOOL := FALSE;// 停止命令输入,TRUE 表示停止
IN_FULL_OPEN            : BOOL := FALSE;// 全开信号输入,TRUE 表示发生全开
IN_FULL_CLOSE         : BOOL := FALSE;// 全关信号输入,TRUE 表示发生全关
IN_PRESSURE_RELIEF_FAULT : BOOL := FALSE;// 泄压故障信号输入,TRUE 表示发生泄压故障
IN_OVERHEATING_FAULT    : BOOL := FALSE;// 超温故障信号输入,TRUE 表示发生超温故障
IN_RESET_ALARM          : BOOL := FALSE;// 报警复位输入,TRUE 表示执行报警复位

(* 输出 *)
OUT_RUNNING             : BOOL := FALSE;// 运行状态输出,TRUE 表示正在运行
OUT_FAULT               : BOOL := FALSE;// 故障反馈输出,TRUE 表示发生故障

VAR
    // 内部变量
    STARTED             : BOOL := FALSE;// 记录是否已经启动
    STOPPED             : BOOL := FALSE;// 记录是否已经停止
    PRESSURE_RELIEFED   : BOOL := FALSE;// 记录是否已经泄压
    OVERHEATED          : BOOL := FALSE;// 记录是否已经超温
    ALARM_RESET         : BOOL := FALSE;// 记录是否已经报警复位

END_VAR


// 依据输入和内部状态,控制电机启停、故障反馈等行为
ACTION
IF IN_RESET_ALARM THEN
    // 报警复位输入,清除所有故障标志和输出
    PRESSURE_RELIEFED := FALSE;
    OVERHEATED      := FALSE;
    OUT_FAULT         := FALSE;
    ALARM_RESET       := TRUE;
ELSE
    IF IN_MODE_AUTO THEN
      // 自动模式下,根据不同条件自动控制电机启动、停止、故障反馈等行为
      IF IN_START_CMD AND NOT STARTED THEN
            // 启动命令输入且未启动,开始启动
            STARTED         := TRUE;
            STOPPED         := FALSE;
            OUT_RUNNING   := TRUE;
            OUT_FAULT       := FALSE;
            ALARM_RESET   := FALSE;
      END_IF;
      IF IN_STOP_CMD AND NOT STOPPED THEN
            // 停止命令输入且未停止,开始停止
            STOPPED         := TRUE;
            STARTED         := FALSE;
            OUT_RUNNING   := FALSE;
            OUT_FAULT       := FALSE;
            ALARM_RESET   := FALSE;
      END_IF;
      IF IN_FULL_OPEN OR IN_FULL_CLOSE THEN
            // 全开或全关信号输入,立即停止
            STOPPED         := TRUE;
            STARTED         := FALSE;
            OUT_RUNNING   := FALSE;
            OUT_FAULT       := FALSE;
            ALARM_RESET   := FALSE;
      END_IF;
      IF IN_PRESSURE_RELIEF_FAULT AND NOT PRESSURE_RELIEFED THEN
            // 泄压故障信号输入,立即停止并输出故障
            STOPPED         := TRUE;
            STARTED         := FALSE;
            OUT_RUNNING   := FALSE;
            OUT_FAULT       := TRUE;
            PRESSURE_RELIEFED:= TRUE;
            ALARM_RESET   := FALSE;
      END_IF;
      IF IN_OVERHEATING_FAULT AND NOT OVERHEATED THEN
            // 超温故障信号输入,立即停止并输出故障
            STOPPED         := TRUE;
            STARTED         := FALSE;
            OUT_RUNNING   := FALSE;
            OUT_FAULT       := TRUE;
            OVERHEATED      := TRUE;
            ALARM_RESET   := FALSE;
      END_IF;
    ELSE
      // 手动模式下,根据启动、停止命令控制电机启停
      IF IN_START_CMD THEN
            // 启动命令输入,开始启动
            STARTED         := TRUE;
            STOPPED         := FALSE;
            OUT_RUNNING   := TRUE;
            OUT_FAULT       := FALSE;
            ALARM_RESET   := FALSE;
      ELSEIF IN_STOP_CMD THEN
            // 停止命令输入,开始停止
            STOPPED         := TRUE;
            STARTED         := FALSE;
            OUT_RUNNING   := FALSE;
            OUT_FAULT       := FALSE;
            ALARM_RESET   := FALSE;
      END_IF;
      // 手动模式下无故障反馈输出
    END_IF;
END_IF;

END_FUNCTION_BLOCK

在上面的代码中,增加了一个输入参数 `IN_RESET_ALARM`,用于表示是否执行报警复位。如果该输入为 `TRUE`,则清除所有故障标志和输出;否则,按照原来的逻辑进行电机启停和故障反馈的控制。在代码中,增加了一个内部变量 `ALARM_RESET`,用于记录是否已经执行了报警复位操作。

Yzy 发表于 2023-4-18 12:50:55

增加一段手动模式下禁用自动模式;自动模式下禁用手动模式

chatGPT_小智 发表于 2023-4-18 12:51:51

Yzy 发表于 2023-04-18 12:50
增加一段手动模式下禁用自动模式;自动模式下禁用手动 ...

以下是增加了手动模式和自动模式下互斥的 SCL 代码:

FUNCTION_BLOCK Motor_Control_FBTITLE = "Motor Control Function Block"VERSION : UINT := 1;// 版本号(* 输入 *)IN_MODE_AUTO            : BOOL := FALSE;// 手自动模式IN_RUN               : BOOL := FALSE;// 运行状态IN_FAULT_FEEDBACK      : BOOL := FALSE;// 故障反馈IN_OPEN                : BOOL := FALSE;// 全开信号IN_CLOSE               : BOOL := FALSE;// 全关信号IN_PRESSURE_FAULT   : BOOL := FALSE;// 泄压故障IN_TEMP_FAULT         : BOOL := FALSE;// 超温故障IN_ALARM_RESET      : BOOL := BOOL := FALSE;// 报警复位(* 输出 *)OUT_MOTOR_ON            : BOOL;// 电机运行OUT_ERROR_MESSAGE      : STRING;// 错误信息DATA// 内部使用变量bModeAutoPrev         : BOOL := IN_MODE_AUTO;// 上一个手自动模式状态bModeManual          : BOOL;// 手动模式状态

    // 手自动模式互斥
    IF bModeAutoPrev <> IN_MODE_AUTO THEN
      IF IN_MODE_AUTO THEN
            bModeManual := FALSE;
      ELSE
            bModeManual := TRUE;
      END_IF;
      bModeAutoPrev := IN_MODE_AUTO;
    END_IF;

    // 自动模式下禁用手动模式,手动模式下禁用自动模式
    IF IN_MODE_AUTO THEN
      bModeManual := FALSE;
    ELSE
      IN_MODE_AUTO := FALSE;
    END_IF;

    // 全开信号和全关信号互斥
    IF IN_OPEN AND IN_CLOSE THEN
      OUT_ERROR_MESSAGE := '全开信号和全关信号不能同时有效';
    ELSE
      // 全开信号
      IF IN_OPEN THEN
            OUT_MOTOR_ON := TRUE;
            OUT_ERROR_MESSAGE := '';
      // 全关信号
      ELSEIF IN_CLOSE THEN
            OUT_MOTOR_ON := FALSE;
            OUT_ERROR_MESSAGE := '';
      ELSE
            OUT_ERROR_MESSAGE := '';
      END_IF;
    END_IF;

    // 泄压故障和超温故障互斥
    IF IN_PRESSURE_FAULT AND IN_TEMP_FAULT THEN
      OUT_ERROR_MESSAGE := '泄压故障和超温故障不能同时发生';
    ELSE
      // 泄压故障
      IF IN_PRESSURE_FAULT THEN
            OUT_MOTOR_ON := FALSE;
            OUT_ERROR_MESSAGE := '泄压故障';
      // 超温故障
      ELSEIF IN_TEMP_FAULT THEN
            OUT_MOTOR_ON := FALSE;
            OUT_ERROR_MESSAGE := '超温故障';
      ELSE
            OUT_ERROR_MESSAGE := '';
      END_IF;
    END_IF;

    // 报警复位
    IF IN_ALARM_RESET THEN
      OUT_ERROR_MESSAGE := '';
    END_IF;

END_FUNCTION_BLOCK
页: [1]
查看完整版本: S71500利用SCL语言编写电机启停程序FB