Yaskawa V1000 Modbus RTU: Register Map and Frequency Reference Programming
The Yaskawa V1000 series compact AC drive supports Modbus RTU over an isolated RS-485 interface, allowing a master controller (PLC, HMI, PC, or microcontroller) to command frequency, start/stop, read status, and modify most of the drive's 400+ parameters. The most common commissioning error is writing the frequency reference to the wrong Modbus holding register. This reference covers the V1000 register map, addressing conventions, the canonical d1-01 Frequency Reference 1 location at 0x0280, RS-485 wiring, parameter setup, and a troubleshooting matrix for the faults encountered during integration.
1. Prerequisites
Before writing a single holding register, confirm the following:
- Drive model: Yaskawa V1000 (CIMR-VU series). The V1000 is shipped with on-board RS-485 on terminals S+, S-, and IG. No option card is required.
-
Firmware: V1000 drives with U-spec (CIMR-VU) firmware ship with Modbus RTU enabled out of the box. Confirm by reading parameter
H5-01at the keypad. - Hardware: USB-to-RS-485 converter (FTDI FT232R/FT4232H based converters are recommended; avoid CH340 clones for industrial use), twisted-pair shielded cable (Beldan 3106A or equivalent), 120 Ω termination resistor at the bus ends only.
- Software: modpoll (from ModbusTools), Simply Modbus Master, pymodbus (Python), or any Modbus RTU master. modpoll is the fastest path to verify a register before writing PLC code.
- Termination: At least one bus termination (120 Ω across S+/S-) is required for 19200 baud and above. Place a second 120 Ω resistor at the physical far end of the bus when the cable run exceeds 10 m.
2. RS-485 Hardware Wiring
The V1000 exposes RS-485 on control terminal block TB1:
| Terminal | Signal | Function |
|---|---|---|
| S+ | RX/TX + (non-inverting) | RS-485 data high |
| S− | RX/TX − (inverting) | RS-485 data low |
| IG | Isolated ground | Reference for S+/S−; do not bond to PE |
| SC | Shield clamp | Bond shield here, single-ended |
Wire the master D+ to the drive S+ and master D− to S−. Keep the differential pair twisted; the shield should be clamped at SC on the drive end and left floating at the master end unless the master's documentation specifies bonding.
3. Drive Parameter Configuration for Modbus Control
Five parameters must be configured before Modbus writes will produce motion. Configure them from the keypad or by writing to their Modbus holding registers.
| Parameter | Function | Required Value | Modbus Register (hex) |
|---|---|---|---|
b1-01 |
Frequency reference source selection | 2 (Modbus), or 1 (Analog), 0 (Keypad) | 0x0280 ... wait, b1-01 is a configuration parameter, not d1-01. See Section 5. |
b1-02 |
Run command source selection | 2 (Modbus), or 1 (Terminal), 0 (Keypad) | Configuration register |
H5-01 |
Drive Modbus address (1–31) | 1 (default) | 0x04A9 (config register) |
H5-02 |
Baud rate | 3 = 9600, 4 = 19200 | 0x04AA |
H5-03 |
Parity | 0 = None, 1 = Even, 2 = Odd | 0x04AB |
H5-06 |
Send wait time (5–65 ms) | 5 | 0x04AE |
H5-09 |
CE fault detection time (0.0–10.0 s) | 2.0 | 0x04B1 |
H5-10 |
CE fault selection (0 = continue, 1 = coast, 2 = decel) | 1 | 0x04B2 |
b1-01 (reference) and b1-02 (run) must be set to 2 for pure Modbus control. Mixing sources (e.g., reference via Modbus, run via terminal) requires b1-01 = 2 AND b1-02 = 1, and a run command on a digital input.4. Modbus Register Map Overview
The V1000 Modbus map is partitioned into four functional regions:
- Monitor region (read-only): 0x0001 – 0x0020. Contains drive status, output frequency (0.01 Hz units), output current (0.1 A), output voltage (1 V), DC bus voltage (1 V), and the active fault word.
-
Command region (read/write): 0x0280 – 0x02AF. Contains the most-used writable parameters:
d1-01throughd1-17frequency references, acceleration/deceleration ramps, and other frequently changed settings. -
Configuration region (read/write): 0x0300 – 0x04FF. All other drive parameters, addressable by their four-digit number.
b1-01is at 0x0301,H5-01is at 0x04A9, etc. - Function-code run command: 0x0001 (bit 0 = forward, bit 1 = reverse). Some V1000 manuals list a run command register at 0x0001; the V1000 A-spec uses 0x0001 for a different purpose. Always confirm against the manual revision.
5. d1-01 Frequency Reference Register
The most-commonly written Modbus register on a V1000 is the Frequency Reference 1, parameter d1-01. Its address is 0x0280 (640 decimal).
| Parameter | Modbus Register (PDU hex) | Decimal (PDU) | Data Type | Scale | Range |
|---|---|---|---|---|---|
| d1-01 (Frequency Reference 1) | 0x0280 | 640 | UINT16 (Big-Endian) | 0.01 Hz | 0.00 – 400.00 Hz (set by E1-04) |
| d1-02 (Frequency Reference 2) | 0x0281 | 641 | UINT16 | 0.01 Hz | 0.00 – max freq |
| Output Frequency (monitor) | 0x0001 | 1 | UINT16 | 0.01 Hz | 0.00 – max freq |
| Output Current (monitor) | 0x0002 | 2 | UINT16 | 0.1 A | 0.0 – rated × 2 |
| Drive Status (monitor) | 0x0000 | 0 | UINT16 | bits | bit0=running, bit1=reverse, bit2=jog, bit3=accel, bit4=decel, bit5=at-speed |
| Active Fault Code (monitor) | 0x0003 | 3 | UINT16 | code | e.g., 0x0010=OC, 0x0006=UV1 |
12000 sets 120.00 Hz; writing 60 sets 0.60 Hz. Forgetting the ×100 scaling is a frequent first-attempt failure.6. PDU vs Protocol Addressing
Modbus addresses can be expressed two ways:
-
PDU (Protocol Data Unit) address: The zero-based address used in the raw frame. For
d1-01this is 0x0280 = 640. -
Protocol (or "Modbus convention") address: The one-based, 5-digit "register number" found in some Yaskawa manuals. For
d1-01this is 0x1281 (4xxxx-range) = 4737.
modpoll's -0 flag uses PDU addressing; -1 uses protocol addressing. When using modpoll against a V1000, always pass -0:
modpoll.exe -m rtu -p none -1 -0 -r 640 -b 9600 -a 1 com3 12000
Breakdown:
| Argument | Meaning |
|---|---|
-m rtu |
Modbus RTU framing |
-p none |
No parity (matches H5-03 = 0) |
-1 |
1 stop bit (matches typical drive setting) |
-0 |
Use 0-based (PDU) addressing |
-r 640 |
Register 640 (0x0280 = d1-01) |
-b 9600 |
9600 baud (H5-02 = 3) |
-a 1 |
Drive Modbus address 1 (H5-01 = 1) |
com3 |
Serial port on Windows (use /dev/ttyUSB0 on Linux) |
12000 |
Frequency value (120.00 Hz) |
7. Raw Frame Reference: 0x10 Write Single Register
Function code 0x10 (16 decimal, Write Multiple Registers) is required for any 16-bit Modbus write. The following frame was captured on a V1000 setting 120.00 Hz:
01 10 02 80 00 01 02 2E E0 86 78
Decoded byte by byte:
| Offset | Hex | Field | Value |
|---|---|---|---|
| 0 | 01 | Slave ID | 1 (H5-01) |
| 1 | 10 | Function code | 0x10 = Write Multiple Registers |
| 2–3 | 02 80 | Starting register | 0x0280 = 640 (d1-01) |
| 4–5 | 00 01 | Quantity of registers | 1 |
| 6 | 02 | Byte count | 2 (one UINT16) |
| 7–8 | 2E E0 | Register value (big-endian) | 0x2EE0 = 12000 decimal = 120.00 Hz |
| 9–10 | 86 78 | CRC-16 (Modbus, low byte first) | 0x7886 |
The drive's reply on success is:
01 10 02 80 00 01 40 E0
Note the echoed starting address 02 80 and quantity 00 01 — this is the standard 0x10 acknowledgement.
8. CRC-16 Calculation
Modbus RTU uses CRC-16/MODBUS (polynomial 0xA001, reflected 0x8005) with the low byte transmitted first. Python implementation:
def crc16_modbus(data: bytes) -> bytes:
crc = 0xFFFF
for byte in data:
crc ^= byte
for _ in range(8):
if crc & 0x0001:
crc = (crc >> 1) ^ 0xA001
else:
crc >>= 1
return bytes([crc & 0xFF, (crc >> 8) & 0xFF])
# Usage for the frame above:
frame = bytes.fromhex("01 10 02 80 00 01 02 2E E0".replace(" ", ""))
tx = frame + crc16_modbus(frame)
# tx = 01 10 02 80 00 01 02 2E E0 86 78
Most tools (modpoll, pymodbus, libmodbus) compute the CRC automatically. If you are implementing a custom master, use a runtime-checked polynomial — never reuse a "works on the bench" CRC table without validation against a known vector.
9. Reading Back Status and Output Frequency
Function code 0x03 (Read Holding Registers) or 0x04 (Read Input Registers) reads the monitor region. To read the output frequency and drive status:
modpoll.exe -m rtu -p none -1 -0 -r 1 -c 2 -b 9600 -a 1 com3
This reads registers 0x0001 (output frequency) and 0x0002 (output current). To read the active fault code:
modpoll.exe -m rtu -p none -1 -0 -r 3 -c 1 -b 9600 -a 1 com3
Common V1000 fault codes returned at register 0x0003:
| Code (hex) | Code (dec) | Fault | Common Cause |
|---|---|---|---|
| 0x0001 | 1 | EF0 (Option External Fault) | External trip on SI-/DI terminal |
| 0x0006 | 6 | UV1 (DC Bus Undervoltage) | Low input voltage, blown fuse |
| 0x000A | 10 | OC (Overcurrent) | Motor short, accel too short, locked rotor |
| 0x0011 | 17 | OH (Heatsink Over-Temp) | Blocked airflow, fan failure, ambient > 50 °C |
| 0x0031 | 49 | CE (Modbus Communication Loss) | Wiring break, address mismatch, baud mismatch |
| 0x0083 | 131 | EF0 retry / parameter mismatch | Parameter reload needed |
10. Run Command via Modbus
Yaskawa V1000 supports a run command via function code 0x05 (Write Single Coil) or, more commonly, via 0x10 with a control word register. For the V1000, the most portable approach is to use the run command bits in the control word at register 0x0001 (varies by manual revision). However, the documented cross-platform method is to drive terminals: with b1-02 = 1 (terminal run), a Modbus-controlled PLC or HMI can close digital inputs S1 (forward) and S2 (reverse) using a 24 V signal. For pure Modbus run/stop, set b1-02 = 2 and issue 0x10 writes to the control register at 0x0001.
modpoll.exe -m rtu -p none -1 -0 -r 1 -b 9600 -a 1 com3 1 # Start forward
modpoll.exe -m rtu -p none -1 -0 -r 1 -b 9600 -a 1 com3 0 # Stop
Safety: The V1000 will start the motor the instant the run command and a non-zero frequency reference are present. Always verify the b1-03 stop method (ramp, coast, DC brake) and b1-05 minimum output frequency before commissioning.
11. Alternative Master Tools
| Tool | Platform | Use Case | Notes |
|---|---|---|---|
| modpoll (ModbusTools) | Windows, Linux | Quick command-line read/write | Best for bench commissioning |
| Simply Modbus Master (Trial) | Windows | Frame-level message crafting | Excellent for diagnosing bad CRC or framing |
| pymodbus | Python 3.x | Custom PC / SCADA integration | Cross-platform; pip install pymodbus |
| libmodbus | C / C++ | Embedded Linux, custom firmware | Used by Yaskawa DriveWizard protocol plug-ins |
| Node-RED node-red-contrib-modbus | Node.js | Visual dashboards, IIoT | Good for Modbus TCP/IP after gateway conversion |
| Yaskawa DriveWizard Industrial | Windows | OEM programming, parameter upload/download | Officially supported by Yaskawa |
12. pymodbus Example: Continuous Speed Sweep
After commissioning, the following Python script ramps the drive through 0–60 Hz in 1 Hz steps. It assumes b1-01 = 2, b1-02 = 2, and a run command held high via terminal S1.
from pymodbus.client import ModbusSerialClient
import time
client = ModbusSerialClient(
port='COM3', baudrate=9600, parity='N', stopbits=1, bytesize=8, timeout=1
)
client.connect()
try:
for hz in range(0, 61):
value = hz * 100 # 0.01 Hz units
client.write_register(0x0280, value, slave=1)
print(f"Requested {hz:2d} Hz (reg 0x0280 = {value})")
time.sleep(0.5)
client.write_register(0x0280, 0, slave=1)
finally:
client.close()
13. Troubleshooting Matrix
| Symptom | Likely Root Cause | Diagnostic | Fix |
|---|---|---|---|
| No reply from drive, modpoll times out | Wiring polarity, wrong COM port, drive in STOP with b1-02 ≠ 2
|
Loopback test on the USB-RS485 adapter (TX/RX shorted through 120 Ω). Verify SC clamp and IG isolation. | Swap S+/S−; confirm com port in Device Manager; set b1-02 = 2
|
| CRC error from master | Parity or stop bit mismatch | Decode byte stream with Simply Modbus Master | Set H5-03 = 0 (no parity) and 1 stop bit on master |
| Drive replies but frequency stays 0 | Writing wrong register (0x0001 instead of 0x0280) | Capture bus with USB sniffer; verify starting address field | Use -r 640 with -0 in modpoll |
| Frequency command accepted but motor does not run | Run source not set to Modbus; no run bit asserted | Read drive status at 0x0000; bit 0 = running | Set b1-02 = 2 and write 1 to control register |
| CE fault (0x31) every few seconds | Cable noise, missing termination, EMI from VFD output | Inspect shield bonding, check S+/S− continuity with drive powered | Add 120 Ω terminator at both ends; route RS-485 ≥ 30 cm from motor output cables |
| Frequency set to e.g. 60 Hz, drive reports 6000.00 Hz on keypad | Misread 0.01 Hz scaling | Calculate: 60.00 Hz → 6000 decimal | Multiply Hz by 100 before writing |
| modpoll shows "Illegal Function" exception 01 | Function code 0x10 used on a read-only register, or vice versa | Check the monitor region is read-only | Use 0x03 / 0x04 to read 0x0001–0x0020 |
| modpoll shows "Illegal Data Address" exception 02 | Address 0 is in the "write-protect" gap; using 1-based addressing with -0 | Verify register exists in map | Drop -0 only if you have protocol addressing; otherwise check V1000 manual for unused regions |
| Drive parameter changes are lost on power cycle | Parameter was set via RAM only, not "Enter" confirmed | Manual: writes to 0x0900 (Enter command) commit to EEPROM | Write 0 to register 0x0900 to discard, or 1 to commit |
| Bus works at 9600 but fails at 19200 | Missing termination, long cable, drive H5-06 wait time too short | Oscilloscope S+/S− waveform; check rise time | Add termination; set H5-06 = 5 ms minimum |
14. Enter Command and Parameter Persistence
The V1000 buffers parameter writes to RAM. To commit to EEPROM, write to the Enter command register:
| Register | Function | Values |
|---|---|---|
| 0x0900 | Enter command | 0 = discard pending changes, 1 = commit to EEPROM |
| 0x0901 | User parameter initialization (initialize to defaults) | 0 = no action, 1110 = reset to factory defaults (V1000 specific) |
15. Modbus TCP/IP Variant
Yaskawa also offers a Modbus TCP/IP variant, used when interfacing to factory MES/ERP systems or when the controller is Ethernet-only. The same register map (0x0001, 0x0280, etc.) applies, but the framing uses TCP port 502 and the slave address is encoded in the MBAP header. The protocol is described on the Yaskawa Modbus TCP/IP product page, and is supported via the SI-EN3 / SI-EN3D Ethernet option card on the V1000. Most of the register-map content above is identical between the RTU and TCP/IP variants.
16. Field Commissioning Checklist
- Verify input voltage and motor nameplate (V, FLA, RPM, kW) match the V1000 rating.
- Wire S+, S−, and IG to the master. Add 120 Ω at both physical ends.
- From the keypad, set
b1-01 = 2,b1-02 = 2,H5-01 = 1,H5-02 = 3(9600),H5-03 = 0(none),H5-09 = 2.0,H5-10 = 1(coast on loss). - Run an autotune (T1-01 = 1 for rotational, 2 for stationary).
- Use modpoll to read register 0x0000 (status) and confirm normal response.
- Write 0x2EE0 (12000) to register 640 (d1-01). Issue a run command. Verify motor accelerates to ~120 Hz if
E1-04allows; otherwise scale to your maximum frequency. - Read register 0x0003 to confirm no active faults.
- Commit parameters with write to 0x0900 = 1.
FAQ
Why does d1-01 use register 0x0280 instead of 0x0001 on the Yaskawa V1000?
Register 0x0001 on the V1000 is the Output Frequency monitor (read-only, scaled 0.01 Hz). The frequency reference, parameter d1-01, lives in the command region at 0x0280 (640 decimal). Confusing the two is the most common cause of a drive that acknowledges the write but never accelerates.
How do I calculate CRC-16 for V1000 Modbus RTU frames?
Use CRC-16/MODBUS with polynomial 0xA001 and an initial value of 0xFFFF. Process the address, function, data, and sub-data bytes; the resulting 16-bit value is appended low byte first. modpoll and pymodbus compute this automatically; a Python implementation is shown in Section 8.
What is the difference between PDU (-0) and protocol (-1) addressing in modpoll?
PDU (-0) uses zero-based raw register addresses; for d1-01 this is 640. Protocol (-1) uses the one-based 4xxxx register numbers from some older Yaskawa manuals (4737 for d1-01). The V1000 register map lists PDU addresses, so always pass -0 to modpoll when writing to the V1000.
Why does writing 12000 to d1-01 result in 120.00 Hz and not 12,000 Hz?
The V1000 stores frequency references as integer hundredths of a Hz, with a base unit of 0.01 Hz. A value of 12000 decimal = 120.00 Hz. The same scaling applies to the output frequency monitor (0x0001) and the read-back in U1-01 on the keypad.
How do I enable Modbus-only run/stop control on the V1000?
Set parameter b1-02 (run command source) to 2 for Modbus. The frequency reference source b1-01 must also be 2. Then write 1 to the control word (0x0001, function 0x10) to start, and 0 to stop. The drive will then accept both reference and run over RS-485 without any terminal wiring.