With the ABB Drives profile, the PLC writes the control word to 400001 and the speed reference to 400002, and reads the status word from 400004. Typical control words are 1150 (0x047E) for ready/stop, 1151 (0x047F) to run and 1278 (0x04FE) to reset a fault. The reference is scaled so 20000 equals the speed in 46.01 (or the frequency in 46.02), and the program polls the drive continuously and stops on a fault or comm loss.
- Send 0x047E first, then 0x047F to run: the drive needs the ready state
- 20000 = 46.01 speed scaling (or 46.02 for frequency); negative = reverse
- Read the status word every cycle and use its bits, not assumptions
- Alternate read and write requests and supervise both with a watchdog
Lab 19 proved the link. Now the PLC takes control of the ACS580: start and stop from the conveyor logic, speed from a recipe or HMI, and all drive status back into the alarm system from Lab 13.
Step 1: Understand the ABB Drives Control Word
| Bit | Name | 1 means | Typical run value |
|---|---|---|---|
| 0 | OFF1_CONTROL | Run allowed (0 = ramp stop) | 1 |
| 1 | OFF2_CONTROL | No coast stop | 1 |
| 2 | OFF3_CONTROL | No emergency ramp stop | 1 |
| 3 | INHIBIT_OPERATION | Operation enabled | 1 |
| 4 | RAMP_OUT_ZERO | Ramp generator output enabled | 1 |
| 5 | RAMP_HOLD | Ramp not held | 1 |
| 6 | RAMP_IN_ZERO | Ramp input enabled | 1 |
| 7 | RESET | Fault reset on rising edge | 0 |
| 10 | REMOTE_CMD | Fieldbus control enabled | 1 |
Control word builder
Tick bits or use the presets. The value is what the PLC writes to 400001.
Step 2: Scale the Speed Reference
Reference scaling calculator
Reference 1 of 20000 corresponds to parameter 46.01 Speed scaling (or 46.02 Frequency scaling).
(* Scale an HMI speed in % (0..100) to reference 1 *)
Ref1 := REAL_TO_INT(Par_Speed_Pct * 200.0); (* 100 % -> 20000 = 46.01 *)
IF Cmd_Reverse THEN Ref1 := -Ref1; END_IF;Step 3: Poll the Drive Cyclically
Use two Modbus requests and run them one after the other, forever: write CW + Ref1 (FC16, 2 registers from 400001), then read SW + Act1 + Act2 (FC03, 3 registers from 400004). A small step counter starts the next request when the previous one is DONE or ERR.
CASE Comm_Step OF
0: WR(EN := FALSE); Comm_Step := 1;
1: Wr_Buf[0] := Drive_CW; Wr_Buf[1] := Ref1;
WR(EN := TRUE, COM := 1, SLAVE := 1, FCT := 16, TIMEOUT := 500,
ADDR := 0, NB := 2, DATA := ADR(Wr_Buf));
IF WR.DONE OR WR.ERR THEN Wr_Err := WR.ERR; RD(EN := FALSE); Comm_Step := 2; END_IF;
2: RD(EN := TRUE, COM := 1, SLAVE := 1, FCT := 3, TIMEOUT := 500,
ADDR := 3, NB := 3, DATA := ADR(Rd_Buf));
IF RD.DONE OR RD.ERR THEN
Rd_Err := RD.ERR;
IF NOT RD.ERR THEN Drive_SW := Rd_Buf[0]; Drive_Act1 := Rd_Buf[1]; END_IF;
WR(EN := FALSE); Comm_Step := 1;
END_IF;
END_CASE;
T_Comm(IN := Wr_Err OR Rd_Err, PT := T#1s); (* comm watchdog *)
Alm_VFD_Comm := Alm_VFD_Comm OR T_Comm.Q;Pin names follow the AC500 V2 MODMAST block and are shown for structure. Check your library help for exact names, the meaning of EN (edge or level) and whether ADDR is 0- or 1-based. Only one request may be active on COM1 at a time.
Step 4: Decode the Status Word and Run the Drive
| SW bit | Name | Meaning when 1 | Used for |
|---|---|---|---|
| 0 | RDY_ON | Ready to switch on | Sts_VFD_Ready |
| 1 | RDY_RUN | Ready to operate | |
| 2 | RDY_REF | Running, following reference | Sts_VFD_Running |
| 3 | TRIPPED | Fault active | Alm_VFD_Fault (Lab 13) |
| 7 | ALARM | Warning active | HMI warning |
| 8 | AT_SETPOINT | Actual = reference | Sequence permissive |
| 9 | REMOTE | Fieldbus control active | Alarm if lost |
PLC → ACS580 Modbus simulator
Set a speed, press Start and watch the control word, reference and status word. Inject a drive fault, reset it, then pull the cable.
Step 5: Commissioning Test
| ID | Check | How to check | Pass criterion | Result |
|---|---|---|---|---|
| Drive control tests | ||||
| V-01 | Ready | PLC writes 0x047E | SW bit 0 = 1, drive shows remote/fieldbus | |
| V-02 | Run | Start in auto | CW 0x047F, motor runs to reference | |
| V-03 | Speed | Change Par_Speed_Pct 50 → 100 % | Actual follows, at setpoint bit set | |
| V-04 | Stop | Press Stop | CW 0x047E, ramp stop | |
| V-05 | Fault reset | Trip drive (e.g. remove enable), reset | Alm_VFD_Fault, cleared with 0x04FE edge | |
| V-06 | Comm loss | Unplug cable while running | Drive EFB comm loss fault, PLC Alm_VFD_Comm | |
Practice Exercise
Add Act1 (motor speed) and Act2 to the HMI, scaled to rpm and amps, and add a second speed preset for the slow-down step from Lab 17.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Drive does not start, CW 0x047F | 0x047E not sent first, or 20.01 not EFB | Send 0x047E, then 0x047F; set 20.01 to embedded fieldbus |
| Runs but ignores speed | 22.11/28.11 not EFB ref1 or wrong control mode | Set the reference source for the active control mode |
| Speed is half/double expected | 46.01 scaling differs from your assumption | Read 46.01 and rescale |
| Fault will not reset | Reset bit held, no rising edge | Pulse 0x04FE for one cycle, then 0x047E |
| EFB comm loss during normal running | Poll cycle slower than 58.16, or errors | Speed up polling, check counters, increase 58.16 |
Frequently asked questions
What is the ACS580 control word to start the drive?
With the ABB Drives profile, write 1150 (0x047E) to make the drive ready, then 1151 (0x047F) to run. 0x047E again stops with a ramp.
How do I reset an ACS580 fault over Modbus?
Set bit 7 of the control word with a rising edge, for example write 1278 (0x04FE) for one cycle, then return to 0x047E.
How is the ACS580 speed reference scaled?
In the ABB Drives profile, a reference of 20000 equals the value of 46.01 Speed scaling (or 46.02 Frequency scaling). Negative values mean reverse.
Which status word bit shows the ACS580 is running?
Bit 2 (RDY_REF) is set when the drive is running and following the reference. Bit 3 shows a fault and bit 8 shows it is at setpoint.
How fast should the PLC poll the drive?
Fast enough that control frames arrive well inside 58.16 Communication loss time. At 19.2 kbit/s a write/read pair takes tens of milliseconds, so a few hundred milliseconds per cycle is easily achieved.