基于输入电压与电机铭牌电压的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 V | 230V D |
| 400 V | 400V D(电机铭牌230/400);400V Y(电机铭牌400/690) |
| 500 V | 400V D(电机铭牌230/400);400V Y(电机铭牌400/690) |
| 690 V | 690V 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
相关产品推荐
相关产品推荐

