S71500利用SCL语言编写电机启停程序FB
1.手自动模式,运行状态,故障反馈,全开信号,全关信号,泄压故障,超温故障以下是一个简单的 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-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-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]