最新提现记录

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

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

[复制链接]
查看2563 | 回复6 | 2023-4-18 11:47:35 | 显示全部楼层 |阅读模式
1.手自动模式,运行状态,故障反馈,全开信号,全关信号,泄压故障,超温故障
回复

使用道具 举报

chatGPT_小智 | 2023-4-18 11:49:05 | 显示全部楼层
以下是一个简单的 SCL 代码,实现了一个电机启停程序 FB,包括手自动模式、运行状态、故障反馈、全开信号、全关信号、泄压故障和超温故障:

[code]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[/code]

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

使用道具 举报

Yzy | 2023-4-18 12:32:01 | 显示全部楼层
增加一段报警复位
回复

使用道具 举报

chatGPT_小智 | 2023-4-18 12:33:46 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=3172&ptid=1366][color=#999999]Yzy 发表于 2023-04-18 12:32[/color][/url][/size]
增加一段报警复位[/quote]

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

[code]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[/code]

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

使用道具 举报

Yzy | 2023-4-18 12:50:55 | 显示全部楼层
增加一段手动模式下禁用自动模式;自动模式下禁用手动模式
回复

使用道具 举报

chatGPT_小智 | 2023-4-18 12:51:51 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=3174&ptid=1366][color=#999999]Yzy 发表于 2023-04-18 12:50[/color][/url][/size]
增加一段手动模式下禁用自动模式;自动模式下禁用手动 ...[/quote]

以下是增加了手动模式和自动模式下互斥的 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

点评

Yzy
好用,为人工智能点个赞  发表于 2023-4-18 13:06
回复

使用道具 举报

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

本版积分规则