For eight large motors I would not use one guessed delay such as “start one every 10 seconds.” I would use a small state machine and make each transition depend on both time and evidence that the previous motor has finished accelerating.
For a transformer-fed bus, a useful screening approximation is:
I_total,start ≈ Σ(running motor FLA) + LRA_of_next_motor
Voltage dip % ≈ transformer impedance % ×
I_total,start / transformer rated secondary current
For a DOL induction motor, locked-rotor current is commonly around 6–7 times full-load current. Schneider gives the same transformer screening relationship and says a typical desirable motor-start voltage drop is about 10–12%:
https://www.se.com/us/en/faqs/FA102209/
Example only: a 1,000 A transformer with 5% impedance, 300 A of motors already running, and a next motor LRA of 1,200 A gives:
dip ≈ 5% × (300 + 1,200) / 1,000 = 7.5%
That is only a screening calculation. Cable impedance, utility source impedance, transformer thermal loading, motor torque/speed curves, contactor ratings and protection coordination still need to be checked by the electrical engineer.
next_start_allowed =
motor_n_run_feedback
AND motor_n_at_speed
AND NOT motor_n_overload
AND bus_voltage >= V_min
AND transformer_current <= I_allow
AND settling_timer_done
If there is no speed switch, at_speed can come from a VFD/soft-starter “run” or “at reference” signal, or from measured current falling below a commissioned threshold after the inrush peak. The timer is then a minimum settling time, not the sole proof that acceleration completed.
Measure acceleration during commissioning under the worst expected mechanical load. If T_timeout expires before run/at-speed feedback, stop the sequence, identify the failed motor, and require an operator reset. Do not automatically start the remaining motors around an unexplained failure unless the process hazard review explicitly permits it.
This is vendor-neutral pseudocode for the sequence controller. The real safety chain, overload contacts and emergency stop should be hardwired or implemented in a safety-rated system; a normal PLC boolean is not the safety function.
(* One motor may be in the STARTING state at a time. *)
IF EStopOK = FALSE OR MainTrip OR AnyOverload THEN
FOR i := 1 TO 8 DO
MotorCmd[i] := FALSE;
END_FOR;
Step := 0;
SequenceFault := TRUE;
END_IF;
CASE Step OF
0: (* idle *)
IF StartSequence AND EStopOK AND NOT SequenceFault THEN
MotorIndex := 1;
Step := 10;
END_IF;
10: (* verify capacity before starting the next motor *)
StartPermit :=
BusVoltagePct >= MinBusVoltagePct
AND TransformerCurrent <= MaxTransformerCurrent
AND NOT MotorOverload[MotorIndex];
IF StartPermit THEN
MotorCmd[MotorIndex] := TRUE;
Step := 20;
END_IF;
20: (* wait for real run/at-speed feedback, with timeout *)
SettleTimer(
IN := MotorRunFb[MotorIndex] AND MotorAtSpeed[MotorIndex],
PT := SettleTime[MotorIndex]);
StartTimeout(
IN := MotorCmd[MotorIndex] AND NOT SettleTimer.Q,
PT := StartTimeoutTime[MotorIndex]);
IF StartTimeout.Q THEN
MotorCmd[MotorIndex] := FALSE;
FailedMotor := MotorIndex;
SequenceFault := TRUE;
Step := 900;
ELSIF SettleTimer.Q THEN
Step := 30;
END_IF;
30: (* advance only after the previous start has settled *)
IF MotorIndex < 8 THEN
MotorIndex := MotorIndex + 1;
Step := 10;
ELSE
SequenceComplete := TRUE;
Step := 100;
END_IF;
100: (* all motors running *)
IF StopSequence THEN
Step := 200;
MotorIndex := 8;
END_IF;
200: (* optional reverse-order stop *)
MotorCmd[MotorIndex] := FALSE;
IF NOT MotorRunFb[MotorIndex] THEN
IF MotorIndex > 1 THEN
MotorIndex := MotorIndex - 1;
ELSE
Step := 0;
END_IF;
END_IF;
900: (* faulted: preserve diagnosis until deliberate reset *)
IF ResetFault AND EStopOK AND NOT MainTrip AND NOT AnyOverload THEN
SequenceFault := FALSE;
Step := 0;
END_IF;
END_CASE;
Star-delta: lower line current, but has a transition disturbance and only suits motors/loads that can accelerate with reduced torque.
Soft starters: reduce mechanical shock and starting current. Schneider publishes a four-pump cascade example using one soft starter and sequenced contactors: https://www.se.com/ca/en/download/document/NNZ85564/
VFDs: best when the process also needs speed control, but require harmonic, EMC, bypass and protection review.
Finally, trend actual bus voltage, current and start duration for every motor. That turns the sequence from a timer guess into a commissioned load-management system.
For eight large motors I would not use one guessed delay such as “start one every
10 seconds.” I would use a small state machine and make each transition depend on
both time and evidence that the previous motor has finished accelerating.
First-pass electrical checkFirst-pass electrical check
For a transformer-fed bus, a useful screening approximation is:
I_total,start ≈ Σ(running motor FLA) + LRA_of_next_motor Voltage dip % ≈ transformer impedance % × I_total,start / transformer rated secondary currentFor a DOL induction motor, locked-rotor current is commonly around 6–7 times
full-load current. Schneider gives the same transformer screening relationship
and says a typical desirable motor-start voltage drop is about 10–12%:
https://www.se.com/us/en/faqs/FA102209/
Example only: a 1,000 A transformer with 5% impedance, 300 A of motors already
running, and a next motor LRA of 1,200 A gives:
dip ≈ 5% × (300 + 1,200) / 1,000 = 7.5%That is only a screening calculation. Cable impedance, utility source impedance,
transformer thermal loading, motor torque/speed curves, contactor ratings and
protection coordination still need to be checked by the electrical engineer.
Better rule for the delayBetter rule for the delay
For motor
n, use:next_start_allowed = motor_n_run_feedback AND motor_n_at_speed AND NOT motor_n_overload AND bus_voltage >= V_min AND transformer_current <= I_allow AND settling_timer_doneIf there is no speed switch,
at_speedcan come from a VFD/soft-starter “run”or “at reference” signal, or from measured current falling below a commissioned
threshold after the inrush peak. The timer is then a minimum settling time,
not the sole proof that acceleration completed.
A practical initial setting is:
T_settle,n = measured acceleration time_n + contactor/current settling margin T_timeout,n > T_settle,nMeasure acceleration during commissioning under the worst expected mechanical
load. If
T_timeoutexpires before run/at-speed feedback, stop the sequence,identify the failed motor, and require an operator reset. Do not automatically
start the remaining motors around an unexplained failure unless the process
hazard review explicitly permits it.
IEC 61131-3 Structured Text patternIEC 61131-3 Structured Text pattern
This is vendor-neutral pseudocode for the sequence controller. The real safety
chain, overload contacts and emergency stop should be hardwired or implemented
in a safety-rated system; a normal PLC boolean is not the safety function.
(* One motor may be in the STARTING state at a time. *) IF EStopOK = FALSE OR MainTrip OR AnyOverload THEN FOR i := 1 TO 8 DO MotorCmd[i] := FALSE; END_FOR; Step := 0; SequenceFault := TRUE; END_IF; CASE Step OF 0: (* idle *) IF StartSequence AND EStopOK AND NOT SequenceFault THEN MotorIndex := 1; Step := 10; END_IF; 10: (* verify capacity before starting the next motor *) StartPermit := BusVoltagePct >= MinBusVoltagePct AND TransformerCurrent <= MaxTransformerCurrent AND NOT MotorOverload[MotorIndex]; IF StartPermit THEN MotorCmd[MotorIndex] := TRUE; Step := 20; END_IF; 20: (* wait for real run/at-speed feedback, with timeout *) SettleTimer( IN := MotorRunFb[MotorIndex] AND MotorAtSpeed[MotorIndex], PT := SettleTime[MotorIndex]); StartTimeout( IN := MotorCmd[MotorIndex] AND NOT SettleTimer.Q, PT := StartTimeoutTime[MotorIndex]); IF StartTimeout.Q THEN MotorCmd[MotorIndex] := FALSE; FailedMotor := MotorIndex; SequenceFault := TRUE; Step := 900; ELSIF SettleTimer.Q THEN Step := 30; END_IF; 30: (* advance only after the previous start has settled *) IF MotorIndex < 8 THEN MotorIndex := MotorIndex + 1; Step := 10; ELSE SequenceComplete := TRUE; Step := 100; END_IF; 100: (* all motors running *) IF StopSequence THEN Step := 200; MotorIndex := 8; END_IF; 200: (* optional reverse-order stop *) MotorCmd[MotorIndex] := FALSE; IF NOT MotorRunFb[MotorIndex] THEN IF MotorIndex > 1 THEN MotorIndex := MotorIndex - 1; ELSE Step := 0; END_IF; END_IF; 900: (* faulted: preserve diagnosis until deliberate reset *) IF ResetFault AND EStopOK AND NOT MainTrip AND NOT AnyOverload THEN SequenceFault := FALSE; Step := 0; END_IF; END_CASE;Hardware choiceHardware choice
suits motors/loads that can accelerate with reduced torque.
publishes a four-pump cascade example using one soft starter and sequenced
contactors:
https://www.se.com/ca/en/download/document/NNZ85564/
EMC, bypass and protection review.
Finally, trend actual bus voltage, current and start duration for every motor.
That turns the sequence from a timer guess into a commissioned load-management
system.