You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于输入电压与电机铭牌电压的D/Y接线自动优化方案问询

电机D/Y接线自动选择的高效实现方案(IEC 61131-3 ST语言)

设备与需求概述

  • 测试装置配置:6台负载电机,分为3组(每组2台:1M1/1M2、2M1/2M2、3M1/3M2),支持4种输入电压选项:230V、400V、500V、690V
  • 自动接线规则:根据所选输入电压和电机铭牌电压,自动切换选中电机的D/Y接线,规则如下:
所选输入电压电机接线方式(Delta / Wye)
230 V230V D
400 V400V D(电机铭牌230/400);400V Y(电机铭牌400/690)
500 V400V D(电机铭牌230/400);400V Y(电机铭牌400/690)
690 V690V Y
  • 编程环境:Automation Builder 2.5(搭配AC500 V3 PLC),采用IEC 61131-3标准的Structured Text(ST)语言
  • 已定义结构体:MotorSet(包含2个Motor结构体)、Motor(包含铭牌电压、选中状态、接线状态等属性)
  • 控制开关:gxAutoDYSwitch布尔变量,用于启用/禁用自动切换功能,支持操作员手动覆盖

当前实现问题

现有方案通过重复的IF-ELSIF语句实现逻辑,代码冗余(约200行),每台电机、每种电压都需编写重复判断逻辑。核心代码片段如下:

(*Check motor plate voltage values and the selected voltage and connect the motors to Delta or Wye based on the selections*)

IF gxAutoDYSwitch THEN //TRUE = automatic D/Y selection is enabled

(*The code for all the motor sets when Input voltage is 230 V*)

(*Input voltage is 400 V -> Motor connection 400 V D if selected motor is 230/400 V and 400 V Y if selected motor is 400/690 V*)

IF gx400VSelected THEN //400 V input voltage is selected
        
//Motor set 1 Motor 1
    IF MotorSet1.Motor1.MotorVoltageDelta = 230 AND MotorSet1.Motor1.MotorVoltageWye = 400 AND MotorSet1.Motor1.Selected THEN
                MotorSet1.Motor1.DeltaConnected := TRUE;
                MotorSet1.Motor1.WyeConnected   := FALSE;
                    
            ELSIF   MotorSet1.Motor1.MotorVoltageDelta = 400 AND MotorSet1.Motor1.MotorVoltageWye = 690 AND MotorSet1.Motor1.Selected THEN
                MotorSet1.Motor1.WyeConnected   := TRUE;
                MotorSet1.Motor1.DeltaConnected := FALSE;
        END_IF

//Motor set 1 Motor 2
    IF MotorSet1.Motor2.MotorVoltageDelta = 230 AND MotorSet1.Motor2.MotorVoltageWye = 400 AND MotorSet1.Motor2.Selected THEN
                MotorSet1.Motor2.DeltaConnected := TRUE;
                MotorSet1.Motor2.WyeConnected   := FALSE;
                    
        ELSIF   MotorSet1.Motor2.MotorVoltageDelta = 400 AND MotorSet1.Motor2.MotorVoltageWye = 690 AND  MotorSet1.Motor2.Selected THEN
                MotorSet1.Motor2.WyeConnected   := TRUE;
                MotorSet1.Motor2.DeltaConnected := FALSE;
        END_IF

//Motor set 2 Motor 1 code here written in a similar manner here
//Motor set 2 Motor 2 code here written in a similar manner here
//Motor set 3 Motor 1 code here written in a similar manner here
//Motor set 3 Motor 2 code here written in a similar manner here
(*The code for all the motor sets when Input voltage is 500 V*)
(*The code for all the motor sets when Input voltage is 690 V*)    
  END_IF

高效优化方案

1. 封装逻辑为可重用函数块(FB)

将单台电机的D/Y判断逻辑封装成函数块,避免重复编写相同代码。

步骤1:定义函数块FB_MotorDYSelector

FUNCTION_BLOCK FB_MotorDYSelector
VAR_INPUT
    AutoEnable : BOOL; // 自动功能启用开关
    SelectedInputVoltage : INT; // 所选输入电压(230/400/500/690)
    Motor : Motor; // 传入目标电机结构体
END_VAR
VAR_OUTPUT
    DeltaConnected : BOOL; // Delta接线输出状态
    WyeConnected : BOOL; // Wye接线输出状态
END_VAR

// 核心逻辑实现
IF AutoEnable AND Motor.Selected THEN
    CASE SelectedInputVoltage OF
        230:
            DeltaConnected := TRUE;
            WyeConnected := FALSE;
        400,500:
            // 根据电机铭牌类型判断接线方式
            IF (Motor.MotorVoltageDelta = 230) AND (Motor.MotorVoltageWye = 400) THEN
                DeltaConnected := TRUE;
                WyeConnected := FALSE;
            ELSIF (Motor.MotorVoltageDelta = 400) AND (Motor.MotorVoltageWye = 690) THEN
                DeltaConnected := FALSE;
                WyeConnected := TRUE;
            END_IF
        690:
            DeltaConnected := FALSE;
            WyeConnected := TRUE;
        ELSE:
            // 未知电压,保持原有接线状态
            DeltaConnected := Motor.DeltaConnected;
            WyeConnected := Motor.WyeConnected;
    END_CASE
ELSE
    // 自动功能禁用或电机未选中,保持原有状态
    DeltaConnected := Motor.DeltaConnected;
    WyeConnected := Motor.WyeConnected;
END_IF

步骤2:主程序调用函数块处理所有电机

在主程序中,只需为每台电机调用该函数块,无需重复编写判断逻辑:

VAR
    // 实例化6个函数块,对应6台电机
    Motor1DYSelector : FB_MotorDYSelector;
    Motor2DYSelector : FB_MotorDYSelector;
    Motor3DYSelector : FB_MotorDYSelector;
    Motor4DYSelector : FB_MotorDYSelector;
    Motor5DYSelector : FB_MotorDYSelector;
    Motor6DYSelector : FB_MotorDYSelector;
    
    SelectedInputVoltage : INT; // 统一存储所选输入电压
END_VAR

// 转换输入电压选择为数值
SelectedInputVoltage := 230;
IF gx400VSelected THEN
    SelectedInputVoltage := 400;
ELSIF gx500VSelected THEN
    SelectedInputVoltage := 500;
ELSIF gx690VSelected THEN
    SelectedInputVoltage := 690;
END_IF

// 处理机组1电机1
Motor1DYSelector(AutoEnable := gxAutoDYSwitch, 
                 SelectedInputVoltage := SelectedInputVoltage, 
                 Motor := MotorSet1.Motor1);
MotorSet1.Motor1.DeltaConnected := Motor1DYSelector.DeltaConnected;
MotorSet1.Motor1.WyeConnected := Motor1DYSelector.WyeConnected;

// 处理机组1电机2
Motor2DYSelector(AutoEnable := gxAutoDYSwitch, 
                 SelectedInputVoltage := SelectedInputVoltage, 
                 Motor := MotorSet1.Motor2);
MotorSet1.Motor2.DeltaConnected := Motor2DYSelector.DeltaConnected;
MotorSet1.Motor2.WyeConnected := Motor2DYSelector.WyeConnected;

// 处理机组2电机1
Motor3DYSelector(AutoEnable := gxAutoDYSwitch, 
                 SelectedInputVoltage := SelectedInputVoltage, 
                 Motor := MotorSet2.Motor1);
MotorSet2.Motor1.DeltaConnected := Motor3DYSelector.DeltaConnected;
MotorSet2.Motor1.WyeConnected := Motor3DYSelector.WyeConnected;

// 处理机组2电机2
Motor4DYSelector(AutoEnable := gxAutoDYSwitch, 
                 SelectedInputVoltage := SelectedInputVoltage, 
                 Motor := MotorSet2.Motor2);
MotorSet2.Motor2.DeltaConnected := Motor4DYSelector.DeltaConnected;
MotorSet2.Motor2.WyeConnected := Motor4DYSelector.WyeConnected;

// 处理机组3电机1
Motor5DYSelector(AutoEnable := gxAutoDYSwitch, 
                 SelectedInputVoltage := SelectedInputVoltage, 
                 Motor := MotorSet3.Motor1);
MotorSet3.Motor1.DeltaConnected := Motor5DYSelector.DeltaConnected;
MotorSet3.Motor1.WyeConnected := Motor5DYSelector.WyeConnected;

// 处理机组3电机2
Motor6DYSelector(AutoEnable := gxAutoDYSwitch, 
                 SelectedInputVoltage := SelectedInputVoltage, 
                 Motor := MotorSet3.Motor2);
MotorSet3.Motor2.DeltaConnected := Motor6DYSelector.DeltaConnected;
MotorSet3.Motor2.WyeConnected := Motor6DYSelector.WyeConnected;

2. 进阶优化:使用数组批量处理电机

将所有电机存入数组,通过循环进一步简化代码:

VAR
    MotorArray : ARRAY[1..6] OF Motor; // 存储所有电机的数组
    DYSelectors : ARRAY[1..6] OF FB_MotorDYSelector; // 对应电机的函数块数组
    SelectedInputVoltage : INT;
    i : INT; // 循环变量
END_VAR

// 初始化数组(将原有结构体数据同步到数组)
MotorArray[1] := MotorSet1.Motor1;
MotorArray[2] := MotorSet1.Motor2;
MotorArray[3] := MotorSet2.Motor1;
MotorArray[4] := MotorSet2.Motor2;
MotorArray[5] := MotorSet3.Motor1;
MotorArray[6] := MotorSet3.Motor2;

// 转换输入电压选择为数值
SelectedInputVoltage := 230;
IF gx400VSelected THEN
    SelectedInputVoltage := 400;
ELSIF gx500VSelected THEN
    SelectedInputVoltage := 500;
ELSIF gx690VSelected THEN
    SelectedInputVoltage := 690;
END_IF

// 循环处理所有电机
FOR i := 1 TO 6 DO
    DYSelectors[i](AutoEnable := gxAutoDYSwitch, 
                   SelectedInputVoltage := SelectedInputVoltage, 
                   Motor := MotorArray[i]);
    MotorArray[i].DeltaConnected := DYSelectors[i].DeltaConnected;
    MotorArray[i].WyeConnected := DYSelectors[i].WyeConnected;
END_FOR

// 将处理结果同步回原有结构体
MotorSet1.Motor1 := MotorArray[1];
MotorSet1.Motor2 := MotorArray[2];
MotorSet2.Motor1 := MotorArray[3];
MotorSet2.Motor2 := MotorArray[4];
MotorSet3.Motor1 := MotorArray[5];
MotorSet3.Motor2 := MotorArray[6];

优化优势

  • 代码量大幅压缩:从约200行减少至50-80行
  • 可维护性提升:接线规则集中在函数块内部,修改规则只需调整FB代码,无需修改所有电机的判断逻辑
  • 可读性增强:逻辑分层清晰,避免重复代码带来的错误风险

内容的提问来源于stack exchange,提问作者Overflown Roni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:39:57