CODESYS 的ST语言实战 - 主备切换及保养提示解决方案

引言

在现代工业自动化系统中,电机的可靠运行是至关重要的。为了确保生产线的连续性和效率,通常会使用两个电机来实现主备切换。当一个电机出现故障或需要保养时,备用电机可以立即投入运行以避免生产停滞。本文将介绍一个用于控制两台电机切换的程序,详细讲解其设计思路、代码实现与应用场景。

1  程序设计思路

该程序主要实现了以下功能:

  1. 电机启动与停止:通过外部启动信号控制电机的启动与停止。

  2. 手动选择电机:允许手动选择运行哪台电机。(必要保养时,可以手动切换电机)

  3. 故障检测与切换:自动检测电机故障并切换至备用电机。

  4. 保养提示:记录电机运行时间,并在达到设定的保养时间后发出保养提示。(保养提示,不会停止电机运行)

  5. 运行时间复位:提供复位电机运行时间的功能。

为了实现这些功能,程序通过监控启动信号、手动选择信号以及电机故障状态,采用逻辑判断进行电机切换控制,并记录电机运行时间。

2  程序代码

定义变量

  • FUNCTION_BLOCK PM_MotorSwitch_v2
  • VAR_INPUT
  •          StartStop : BOOL;                 // 启停信号
  •          ManualSelect : INT; // 电机手动选择(0为自动选择,1为选择电机1,2为选择电机2)
  •          Motor1Fault : BOOL; // 电机1故障位,常开
  •          Motor2Fault : BOOL; // 电机2故障位,常开
  •          Motor1MaintainTime : LTIME := LTIME#30D; // 电机1保养时间(默认30天)
  •          Motor2MaintainTime : LTIME := LTIME#30D; // 电机2保养时间(默认30天)
  •          ResetMotor1Time : BOOL; // 复位电机1运行时间
  •          ResetMotor2Time : BOOL; // 复位电机2运行时间
  • END_VAR
  • VAR_OUTPUT
  •         Motor1 : BOOL;                    // 电机1输出
  •         Motor2 : BOOL; // 电机2输出
  •         Motor1RunTime : LTIME; // 电机1运行时间,最长213503d23h34m33s709ms551us615ns
  •         Motor2RunTime : LTIME; // 电机2运行时间,最长213503d23h34m33s709ms551us615ns
  •         Motor1Maintenance  :BOOL;         // 电机1保养提示
  •         Motor2Maintenance  :BOOL;         // 电机2保养提示
  •         StatusWord : BYTE; // 状态字
  • END_VAR
  • VAR
  •         RunningMotor : INT;               // 当前运行的电机编号(1为电机1,2为电机2)
  •         LastRunTimeUpdate : LTIME; // 上一次更新时间
  • END_VAR

逻辑代码

  • (*
  • 版本记录:
  • 版本          日期           作者
  • V1      2024-5-28      工控老王
  • V2      2024-7-30      工控老王
  • *)
  •  
  • // 功能说明:
  • // 该程序通过监控启动信号、手动选择信号以及电机故障状态,实现主从两台电机的切换控制逻辑。
  • // 并记录电机总运行时间,当超过设定时间后,输出保养提示。
  •  
  • // 定义状态字的各个位:
  • // 第1位 (LSB) - 整体运行状态 (0: 停止, 1: 运行)
  • // 第2位 - 电机1运行状态 (0: 停止, 1: 运行)
  • // 第3位 - 电机2运行状态 (0: 停止, 1: 运行)
  • // 第4位 - 电机1故障状态 (0: 正常, 1: 故障)
  • // 第5位 - 电机2故障状态 (0: 正常, 1: 故障)
  • // 第6位 - 电机1保养提示 (0: 正常, 1: 警告)
  • // 第7位 - 电机2保养提示 (0: 正常, 1: 警告)
  •  
  • // 复位电机运行时间
  • IF ResetMotor1Time THEN
  •        Motor1RunTime := LTIME#0S;
  •        ResetMotor1Time := FALSE;
  • END_IF
  •  
  • IF ResetMotor2Time THEN
  •        Motor2RunTime := LTIME#0S;
  •        ResetMotor2Time := FALSE;
  • END_IF
  •  
  • // 初始状态
  • IF StartStop THEN
  •       IF ManualSelect = 1 AND NOT Motor1Fault THEN
  •              RunningMotor := 1;
  •       ELSIF ManualSelect = 2 AND NOT Motor2Fault THEN
  •              RunningMotor := 2;
  •    ELSE
  •       // 没有故障时默认选择电机1
  •       IF NOT Motor1Fault AND NOT StatusWord.0 THEN
  •          RunningMotor := 1;
  •       ELSIF NOT Motor2Fault AND NOT StatusWord.0 THEN
  •          RunningMotor := 2;
  •       END_IF
  •       // 故障切换逻辑
  •       IF  RunningMotor = 1 AND Motor1Fault THEN
  •          Motor1 := FALSE;
  •          IF NOT Motor2Fault THEN
  •             Motor2 := TRUE;
  •             RunningMotor := 2;
  •          ELSE
  •              RunningMotor := 0;
  •          END_IF
  •      ELSIF RunningMotor = 2 AND Motor2Fault THEN
  •         Motor2 := FALSE;
  •         IF NOT Motor1Fault THEN
  •            Motor1 := TRUE;
  •            RunningMotor := 1;
  •         ELSE
  •             RunningMotor := 0;
  •         END_IF
  •     END_IF
  •     END_IF
  • ELSE
  •        RunningMotor := 0;
  • END_IF
  •   
  • // 根据运行电机编号设置电机输出
  • CASE RunningMotor OF
  •         0:
  •                Motor1 := FALSE;
  •                Motor2 := FALSE;
  •         1:
  •                Motor1 := TRUE;
  •                Motor2 := FALSE;
  •         2:
  •                Motor1 := FALSE;
  •                Motor2 := TRUE;
  • END_CASE
  •  
  • // 更新运行时间
  • IF RunningMotor = 1 AND NOT Motor1Fault THEN
  •        Motor1RunTime := Motor1RunTime + (LTIME() - LastRunTimeUpdate);
  • ELSIF runningMotor = 2 AND NOT Motor2Fault THEN
  •        Motor2RunTime := Motor2RunTime + (LTIME() - LastRunTimeUpdate);
  • END_IF
  • LastRunTimeUpdate := LTIME();
  •  
  •  
  •  
  • // 故障复位启动
  • IF Motor1Fault AND Motor2Fault THEN
  •   StartStop := FALSE;
  • END_IF
  •  
  • // 保养提示
  • Motor1Maintenance := Motor1RunTime >= motor1MaintainTime;
  • Motor2Maintenance := Motor2RunTime >= motor2MaintainTime;
  •  
  •  
  • // 状态字更新
  • StatusWord.0 := StartStop;
  • StatusWord.1 := Motor1;
  • StatusWord.2 := Motor2;
  • StatusWord.3 := Motor1Fault;
  • StatusWord.4 := Motor2Fault;
  • StatusWord.5 := Motor1Maintenance;
  • StatusWord.6 := Motor2Maintenance;

3  代码解释

3.1  输入变量

  • StartStop: 启停信号,用于控制电机的启动和停止。

  • ManualSelect: 手动选择电机,0 为自动选择,1 为选择电机 1,2 为选择电机 2。

  • Motor1Fault 和 Motor2Fault: 电机 1 和电机 2 的故障信号。

  • Motor1MaintainTime 和 Motor2MaintainTime: 电机 1 和电机 2 的保养时间。

  • ResetMotor1Time 和 ResetMotor2Time: 复位电机 1 和电机 2 的运行时间。

3.2  输出变量

  • Motor1 和 Motor2: 电机 1 和电机 2 的输出信号。

  • Motor1RunTime 和 Motor2RunTime: 电机 1 和电机 2 的运行时间。

  • Motor1Maintenance 和 Motor2Maintenance: 电机 1 和电机 2 的保养提示。

  • StatusWord: 状态字,用于指示系统的运行状态。

3.3  内部变量

  • RunningMotor: 当前运行的电机编号,1 为电机 1,2 为电机 2。

  • LastRunTimeUpdate: 上一次更新时间,用于计算累计运行时间。

3.4  功能逻辑

  1. 复位运行时间: 检查复位信号,复位对应电机的运行时间。

  2. 启动与选择电机: 根据启动信号和手动选择信号,决定运行哪台电机。

  3. 故障切换: 检测电机故障,自动切换至备用电机。

  4. 运行时间更新: 记录电机的累计运行时间。

  5. 保养提示: 根据设定的保养时间,发出保养提示。

  6. 状态字更新: 更新系统的运行状态。

4  应用场景

该程序主要应用于需要高可靠性和连续性的工业自动化系统中。例如:

  • 制造业生产线:确保生产线在电机故障时能够无缝切换至备用电机,避免停产。

  • 供水系统:保证水泵故障时能够立即切换至备用水泵,确保供水的连续性。

  • 其他系统:可以将电机拓展为两个系统,根据一些条件,自动切换到另一个控制系统。

5  开源版本说明

该程序遵循开源原则,任何人都可以使用、修改和分发此代码。在使用前应进行充分的测试,修改代码时,请秉持分享精神,将您的改进和成果进行分享,以便更多人受益。

总结

通过该程序,可以实现对两台电机的自动切换控制,保证系统的高可靠性和连续性。同时,记录电机的运行时间并提供保养提示,有助于及时维护和保养电机,延长其使用寿命。希望本文能够帮助读者理解电机切换控制的实现原理,并应用于实际项目中。

希望通过本文的介绍,读者能够更好地理解和使用 CODESYS 编程。

往期回顾

CODESYS 的简介及环境安装

在 CODESYS 平台,创建你的第一个项目

介绍 CODESYS 编程软件中的变量

CODESYS 编程软件基本语法和运算符介绍

图片

2024年08月

Tags: