CiA402
Overview
WD DRIVE drivers include a CANopen slave whose motion control follows CiA 402 (IEC 61800-7-201, the CANopen drive and motion control profile). Any standard CANopen master (PLC, motion controller or host software) can command position, velocity and torque, and perform homing, without a vendor-specific protocol.
- Supported on the rotary motor driver stp42 and the linear motor driver lin.
- Eight standard operating modes are supported: PP, PV, PT, HM, IP, CSP, CSV and CST. There is also a vendor-specific auto calibration / tuning mode (0x6060 = −1).
- Communication is CANopen: SDO for configuration and parameter access, PDO for cyclic data, with NMT, heartbeat, EMCY and LSS.
- The complete object dictionary (index/sub-index, data type, access and PDO mapping) is in the object dictionary reference.
The defaults below are for lin (linear motor). The stp42 differences are collected in User Units and Scaling and Product Default Differences.
Before You Start
Bus wiring
- Connect the master and the driver with a standard CAN bus, fitting a 120 Ω termination resistor at both ends.
- Keep every node at the same bitrate.
- Power the driver from a separate supply within the nameplate voltage range, and route the motor power wiring away from the CAN wiring.
Node ID and bitrate
- Factory defaults are node ID
1and 1 Mbit/s. - Both can be changed over the bus with LSS (Layer Setting Services) and stored in the driver, so the next power-up uses the new settings.
Power-up behaviour
- After power-up the driver automatically enters NMT Operational; the master does not need to send NMT Start.
- The CiA 402 state machine starts in Not ready to switch on, then automatically reaches Switch on disabled (0x0020) and waits for the control word.
- Objects are accessible over SDO immediately; the high-voltage motor power stage is enabled only in Operation enabled.
Enabling and the State Machine
States and control word
CiA 402 uses a state machine to sequence enabling. The master writes the control word 0x6040 and reads the current state from the status word 0x6041 (low 7 bits, mask 0x006F).
| State | 0x6041 state bits | Description |
|---|---|---|
| Not ready to switch on | 0x0000 | Initial state after power-up |
| Switch on disabled | 0x0020 | Communication ready, waiting to be enabled |
| Ready to switch on | 0x0021 | Ready (safe state, power stage off) |
| Switched on | 0x0023 | High voltage applied, motion still disabled |
| Operation enabled | 0x0027 | Normal operating state, motion allowed |
| Quick stop active | 0x0007 | Executing a quick stop |
| Fault reaction active | 0x000F | Reacting to a fault (ramping down per the option code) |
| Fault | 0x0008 | Fault latched, reset required |
Common control word commands:
| Command | Control word (0x6040) | From → to |
|---|---|---|
| Shutdown | 0x0006 |
Switch on disabled → Ready to switch on |
| Switch on | 0x0007 |
Ready to switch on → Switched on |
| Enable operation | 0x000F |
Switched on → Operation enabled |
| Disable operation | 0x0007 (bit3 = 0) |
Operation enabled → Switched on |
| Disable voltage | 0x0000 |
Any → Switch on disabled |
| Quick stop | 0x0002 |
Operation enabled → Quick stop active |
| Fault reset | 0x0080 |
Fault → Switch on disabled |
The one-step command
0x000F(Switch on + Enable operation) is recommended; it completes the Ready → Operation enabled transitions in one write.
Status word bits
| Bit | Mask | Name | Meaning |
|---|---|---|---|
| 0–5 | 0x006F |
State bits | See the table above |
| 4 | 0x0010 |
Voltage enabled | DC bus voltage applied |
| 7 | 0x0080 |
Warning | A warning is active (temperature / over-voltage / under-voltage / I²t overload); the state machine is unaffected |
| 9 | 0x0200 |
Remote | Always 1 (control word is always processed) |
| 10 | 0x0400 |
Target reached | Target reached (mode-specific, see below); for calibration, success |
| 11 | 0x0800 |
Internal limit active | Target outside the software position limit (0x607D) |
| 12 | 0x1000 |
Mode-specific | See each mode |
| 13 | 0x2000 |
Mode-specific | See each mode |
Standard enable sequence
Write 0x6040:00 = 0x0006 # Shutdown → 0x6041 = 0x0021 (ready)
Write 0x6040:00 = 0x0007 # Switch on → 0x6041 = 0x0023 (switched on)
Write 0x6040:00 = 0x000F # Enable operation → 0x6041 = 0x0027 (operation enabled)
Safe disable:
Write 0x60FF:00 = 0 # Velocity modes: target velocity to zero
Write 0x6040:00 = 0x0006 # Shutdown → back to ready (safe state)
Note: The mode of operation (0x6060) is accepted only in Operation enabled. Writing 0x6060 while disabled has no effect.
Operating Modes at a Glance
Write 0x6060 to select a mode and read 0x6061 for the active mode. Every mode follows the same skeleton: enable → select mode → write target/parameters → monitor the status word → zero the target → disable.
| 0x6060 | Mode | Loop | Target object | Main feedback | Target reached (bit10) |
|---|---|---|---|---|---|
| 1 | PP profile position | Position | 0x607A | 0x6062 / 0x6064 / 0x60F4 | Inside position window 0x6067 for 0x6068 ms |
| 2 | VL velocity (not supported) | — | — | — | — |
| 3 | PV profile velocity | Velocity | 0x60FF | 0x606B / 0x606C | Inside velocity window 0x606D for 0x606E ms |
| 4 | PT profile torque | Torque | 0x6071 | 0x6074 / 0x6077 | None |
| 6 | HM homing | Velocity → position | 0x6099 etc. | 0x6064 / 0x606C | Homing landing check |
| 7 | IP interpolated position | Position | 0x60C1 | 0x6062 / 0x6064 / 0x60F4 | Same as PP |
| 8 | CSP cyclic sync position | Position | 0x607A + 0x60B0 | 0x6062 / 0x6064 / 0x60F4 | Same as PP |
| 9 | CSV cyclic sync velocity | Velocity | 0x60FF + 0x60B1 | 0x606B / 0x606C | Same as PV |
| 10 | CST cyclic sync torque | Torque | 0x6071 + 0x60B2 | 0x6074 / 0x6077 | None |
| −1 | Auto calibration / tuning (vendor) | — | 0x3000 | 0x6041 bits 10/12/13 | Calibration status word |
PP — Profile Position (0x6060 = 1)
Moves the motor to a target position with a configured velocity, acceleration and deceleration, using either a trapezoidal or an S-curve profile.
Common parameters
| Object | Name | Default (lin) |
|---|---|---|
| 0x607A | Target position | 0 |
| 0x6081 | Profile velocity | 100000 |
| 0x6083 / 0x6084 | Acceleration / deceleration | 5000000 / 5000000 |
| 0x607F | Max profile velocity (limits 0x6081) | 2000000 |
| 0x60C5 / 0x60C6 | Max acceleration / deceleration (0 = unlimited) | 20000000 |
| 0x6086 | Motion profile type (0 = trapezoidal, 1/2/3 = S-curve) | 0 |
| 0x607D | Software position limit (0x607D:01 min / :02 max) | 0 … 395000 |
Set-point handshake: write the target position 0x607A, then accept the new set-point with a rising edge on control word bit4.
| Control word bit | Meaning |
|---|---|
bit4 (0x0010) |
New set-point (rising edge) |
bit5 (0x0020) |
1 = execute immediately; 0 = queue until the current move finishes |
bit6 (0x0040) |
0 = absolute; 1 = relative (relative to the current demand position) |
bit8 (0x0100) |
Halt: decelerate per 0x6084 and hold position |
bit9 (0x0200) |
Queue transition: 0 = after standstill; 1 = on the fly |
- After a set-point is accepted, bit12 (set-point acknowledge) is set; it clears when the set-point is released (bit4 1→0).
- A target outside 0x607D sets bit11 (internal limit active) and rejects the set-point.
- bit10 is set once the target is reached and stays inside the 0x6067 window for 0x6068 ms.
- A following error above 0x6065 for longer than 0x6066 ms sets bit13 (indication only, no fault).
S-curve (0x6086 = 1/2/3): the jerk limits come from 0x60A4 Profile Jerk 1/2, with 0x60A3 Profile Jerk Use selecting their assignment:
| 0x60A3 | Acceleration phase | Deceleration phase |
|---|---|---|
| 1 | Jerk 1 (0x60A4:01) | Jerk 1 |
| 2 | Jerk 1 (0x60A4:01) | Jerk 2 (0x60A4:02) |
| Anything else (default 0) | Derived from the max acceleration | Derived from the max acceleration |
Use the S-curve for high-inertia or precision positioning where vibration matters; the trapezoid (0x6086 = 0) gives the shortest travel time. The ramps of the velocity modes (PV/HM/CSV) are not affected by 0x6086.
PV — Profile Velocity Mode (0x6060 = 3)
Approach the target velocity along the configured acceleration/deceleration ramp; common for continuous motion or conveyors. VL pure velocity mode (0x6060 = 2) is not supported — use PV instead.
| Object | Name | Default (lin) |
|---|---|---|
| 0x60FF | Target velocity | 0 |
| 0x6083 / 0x6084 | Acceleration / deceleration | 5000000 / 5000000 |
| 0x607F | Max profile velocity (limits 0x60FF, 0 = unlimited) | 2000000 |
- The target velocity is clamped to 0x607F; Halt (bit8) ramps the target to zero.
- bit10: actual velocity inside the 0x606D window for 0x606E ms.
- bit12: zero-speed indication, actual velocity below 0x606F for 0x6070 ms.
PT — Profile Torque (0x6060 = 4)
Outputs the target torque directly; the motor settles where load and friction balance it.
| Object | Name | Default (lin) |
|---|---|---|
| 0x6071 | Target torque / force | 0 |
| 0x6072 | Max torque / force (hard limit) | 35000 mN |
| 0x6087 | Torque / force slope (0 = immediate, unlimited ramp) | 5000 |
| 0x6080 | Max motor speed | 2000000 |
Caution: Torque mode has no velocity loop, so the motor keeps accelerating under the commanded torque until load or friction balances it. Confirm the mechanical travel and limits before use. With Halt (bit8), the target torque ramps to zero per 0x6087.
HM — Homing (0x6060 = 6)
The driver searches in a fixed direction (towards the mechanical block) and detects the block when the phase current rises and the position following error grows at the same time, then retracts to the configured landing point to establish the position reference.
Sequence
- Control word bit4 = 1 and bit8 = 0 → start homing and run at the 0x6099:01 speed (the direction is forced negative).
- When the collision conditions hold for 0x2130:04, bit12 is set and the position is reset to 0x607C Home offset.
- The axis retracts by 0x2130:05 in the opposite direction; once the landing point is stable, bit10 is set and homing is complete.
- Cancel homing with bit4 = 0 or bit8 = 1; bit4 must be released before a new search can start.
Block-detection parameters (0x2130)
| Sub | Name | Unit | Description |
|---|---|---|---|
| :01 | Hard stop force limit | mA | Push (current) limit during the search; 0 keeps 0x6072 |
| :02 | Collision current threshold | mA | Current threshold for block detection; 0 disables this condition |
| :03 | Following error threshold | User units | Following-error threshold for block detection; 0 disables this condition |
| :04 | Collision filter time | ms | How long the conditions must hold |
| :05 | Retract distance | User units | Retract distance after the block (direction is automatic) |
Other parameters: 0x607C Home offset (default 0), 0x6099:01 search speed, 0x609A homing acceleration, and the 0x6067/0x6068 landing window.
Confirm the 0x2130 block-detection parameters before homing. lin ships usable defaults (stp42 ships all zeros, which must be configured explicitly); if both detection conditions are disabled, or the current threshold is above the force limit, the driver refuses to start and sets bit13 (failure). Calibrate these values for your motor and mechanics on the bench and never set all thresholds to 0. A search travel beyond 1.1× the software limit range (0x607D) also aborts and sets bit13.
The search direction is fixed negative; 0x6098 Homing method is not used.
IP — Interpolated Position (0x6060 = 7)
The master sends position set-points at a fixed interpolation period and the driver linearly interpolates between them.
- bit4 = 1 enables interpolation (bit12 is set): the axis starts seamlessly from the actual position and waits for the first set-point; bit4 = 0 exits, ramping the velocity to zero per 0x60C5/0x60C6 while holding the position demand.
- The master writes 0x60C1 (interpolated data record) periodically; the period is defined by 0x60C2 (2 ms default).
- The velocity feed-forward is the segment slope, limited by 0x607F.
- Halt (bit8) exits interpolation and ramps the velocity to zero; releasing it resumes smoothly from the latest set-point.
- As the period is short, map 0x60C1 into an RPDO (SDO round-trips are usually too slow).
CSP — Cyclic Synchronous Position (0x6060 = 8)
The master sends target positions periodically and the driver tracks them. The target is 0x607A + 0x60B0 (position offset).
- A change of set-point opens a new interpolation segment whose duration is derived from the measured send period, without relying on SYNC.
- If the master holds the target, the demand stays at the target position.
- Feed-forward comes directly from the master: 0x60B1 velocity feed-forward (limited by 0x607F) and 0x60B2 torque feed-forward.
- On re-enable, after a long gap, or on the first cycle, if the target is far from the current position, the driver catches up smoothly at 0x607F instead of jumping. With 0x607F = 0 it tracks standard CSP directly with the position loop.
- After Halt or a stop ramp, the driver smoothly returns to the master target using the profile selected by 0x6086 (trapezoid / S-curve).
- 0x607F = 0 means unlimited speed; the master is responsible for the trajectory.
- A target outside 0x607D sets bit11, and out-of-range targets are not tracked.
- bit12 = Drive follows command: cleared while the target is taken over locally (Halt, stop ramp) and set again after resuming tracking.
PDO mapping example (RPDO1: 0x607A + 0x60B1)
Write 0x1600:00 = 0
Write 0x1600:01 = 0x607A0020 # target position, int32
Write 0x1600:02 = 0x60B10020 # velocity feed-forward, int32
Write 0x1600:00 = 2
Write 0x1400:02 = 254 # event driven
Write 0x1400:01 clear bit31 # enable RPDO1 (COB-ID = 0x200 + node ID)
The master then sends an 8-byte frame (little-endian: target position + velocity feed-forward) at a fixed rate (for example 1 ms).
CSV — Cyclic Synchronous Velocity (0x6060 = 9)
Target velocity = 0x60FF + 0x60B1 (velocity offset), clamped to 0x607F; the torque feed-forward is 0x60B2. With Halt the target is 0.
- The velocity ramp is limited by 0x60C5 / 0x60C6 (0 = unlimited).
- bit10: actual velocity inside the 0x606D window for 0x606E ms.
- bit12: as in CSP, cleared during local takeover.
CST — Cyclic Synchronous Torque (0x6060 = 10)
Target torque = 0x6071 + 0x60B2 (torque offset); with Halt the target is 0.
- The torque demand ramps per 0x6087 (0 = unlimited), and 0x6080 limits the speed.
- Like PT, it is pure torque control with no target-reached indication (bit10 is not set). Confirm the mechanical safety before use.
Calibration Mode (vendor-specific, 0x6060 = −1)
Used for motor parameter identification and position-sensor calibration.
- Select the calibration sub-mode with 0x3000:01; the supported-mode bitmap is in 0x3000:03.
- Start with a rising edge on control word bit4; abort with bit8 level.
- Status is mirrored into the status word: bit12 = running, bit10 = success, bit13 = failure.
- Results are written and stored persistently; the master can read them from 0x3011 (motor identification), 0x3013 (position-sensor calibration) and 0x3014 (phase calibration).
- The calibration process moves the motor; make sure the mechanics are free to move and the travel is safe.
Running calibration from the host software (wddrive-studio) or the maintenance tool (wddrive-maintain-cli) is recommended; they handle sub-mode selection, status polling and result validation.
Stop Option Codes and Halt
When an option code in 0x605A–0x605E is non-zero, the state machine does not transition immediately; it first executes a deceleration ramp. The status word keeps the pre-transition state during the ramp and changes only once the ramp finishes. The master should wait for the final status word.
| Object | Name | Default | Trigger |
|---|---|---|---|
| 0x605A | Quick stop option code | 2 | Quick stop command (transition 11) |
| 0x605B | Shutdown option code | 1 | Operation enabled → Ready (transition 8) |
| 0x605C | Disable operation option code | 1 | Operation enabled → Switched on (transition 5) |
| 0x605D | Halt option code | 1 | Halt |
| 0x605E | Fault option code | 2 | Fault reaction (transition 14) |
The option-code characteristics:
| Value | Characteristic |
|---|---|
| 0 | Disable the drive immediately, no ramp |
| 1 | Slow down ramp: per 0x6084 profile deceleration |
| 2 | Quick stop ramp: per 0x6085 quick-stop deceleration (falls back to 0x6084 when 0) |
| 3 | Stop on current limit: full-current braking |
| 4 | Stop on voltage limit: full-current braking, reduced as the DC bus approaches over-voltage |
| 5–8 | Same as 1–4, but for 0x605A only; after the ramp the drive stays in Quick stop active |
Halt (bit8) behaviour per mode
| Mode | Halt behaviour |
|---|---|
| PP | Decelerate per 0x6084 and hold position; resumes the original set-point when released |
| PV / CSV | Target velocity to zero, ramp stop |
| PT / CST | Target torque ramps to zero per 0x6087 |
| HM | Aborts homing |
| IP | Exits interpolation, ramps velocity to zero, holds the position demand |
| CSP | Decelerates and holds, then smoothly catches up to the master target when released |
| Calibration (−1) | Aborts the calibration |
Protection and Fault Handling
Protection thresholds
| Monitored quantity | Threshold objects (defaults) | Warning | Fault code (0x603F) |
|---|---|---|---|
| DC bus voltage | 0x2001:01 over-voltage fault 540 (54.0 V), :02 warning 520, :03 under-voltage fault 180, :04 warning 220, :05 filter 100 ms | bit7 | 0x3210 / 0x3220 |
| Output current | 0x2002:01 short-circuit 45000 mA, :02 over-current filter 10 ms, :03 I²t overload level 100 %, :04 I²t max time 2000 ms | I²t warning → bit7 | 0x2320 / 0x2310 / 0x2350 |
| Motor temperature | 0x2003:01 over-temperature fault 850 (85.0 °C), :02 warning 750 (75 °C) | bit7 | 0x4310 |
Error codes:
| Code | Meaning |
|---|---|
| 0x3210 | DC bus over-voltage |
| 0x3220 | DC bus under-voltage |
| 0x2310 | Continuous over-current |
| 0x2320 | Motor-side short circuit |
| 0x2350 | I²t thermal overload |
| 0x4310 | Motor over-temperature |
Fault reaction sequence
- On a protection trip the drive enters Fault reaction active (0x000F), writes the fault code to 0x603F and ramps down per the 0x605E option code.
- When the ramp finishes it automatically enters Fault (0x0008), cutting the high voltage and disabling the power stage.
- The master sends Fault reset (0x6040 bit7 = 1; a short pulse is latched), transitioning to Switch on disabled (0x0020).
- Re-enable using the normal enable sequence.
Read 0x603F:00 # fault code
Read 0x1003:01 … # error history (0x1003:00 is the count, write 0 to clear)
Write 0x6040:00 = 0x0080 # Fault reset
Write 0x6040:00 = 0x0006 # re-enable: Shutdown
Write 0x6040:00 = 0x000F # Switch on + Enable operation
Protection faults are sticky: the fault bit is not cleared automatically when the temperature falls or the over-current passes, so a Fault reset is required. If the root cause remains, the fault trips again after the debounce time — fix the cause first.
User Units and Scaling
All position, velocity, acceleration and torque objects use user units, so trajectories can be planned directly in mechanical units.
| Quantity | lin (linear) | stp42 (rotary) |
|---|---|---|
| Position (0x607A / 0x6062 / 0x6064 / 0x607D) | 0.001 mm (1 µm) | 0.001 rev (1000 = 1 rev) |
| Velocity (0x60FF / 0x606B / 0x606C / 0x6081 / 0x607F) | 0.001 mm/s | 0.001 rev/s (5000 = 300 rpm) |
| Acceleration (0x6083 / 0x6084 / 0x6085 / 0x60C5 / 0x60C6 / 0x609A) | 0.001 mm/s² | 0.001 rev/s² |
| Jerk (0x60A4) | 0.001 mm/s³ | 0.001 rev/s³ |
| Torque / force (0x6071 / 0x6072 / 0x6074 / 0x6076 / 0x6077 / 0x6087 / 0x60B2) | mN | mN·m |
| Current (0x6073 / 0x6075, 0x2000:02, 0x2002 thresholds) | mA | mA |
- The default gear ratio 0x6091 = 1:1 and feed constant 0x6092 = 1000:1 make one user position unit 0.001 mm (lin) or 0.001 rev (stp42). After changing 0x6091 / 0x6092, user units are redefined on the output shaft.
- 0x6063 (position actual internal value) is the raw internal value without gear-ratio scaling, useful for diagnosing the true physical direction.
Inertia / mass objects (used for feed-forward and velocity-loop tuning):
| Product | Object | Name | Default |
|---|---|---|---|
| lin | 0x2110 | Mover mass | 470 g |
| lin | 0x2111 | Load mass | 0 g |
| stp42 | 0x2210 | Motor rotor inertia | 320 g·cm² |
| stp42 | 0x2211 | Load inertia ratio (‰, 1000 = 1.0) | 0 |
The velocity-loop gain is proportional to the total inertia/mass; with a zero inertia/mass object the velocity-loop gain is zero (the motor has no force), so fill these in or run calibration first.
Product Default Differences
lin and stp42 share most of the object structure, but some defaults and object existences differ. The table below uses lin as the reference and lists the corresponding stp42 values; when switching product models, re-send the parameters or read them back to confirm.
| Object | Name | lin default | stp42 default |
|---|---|---|---|
| 0x6072 | Max torque / force | 35000 mN | 720 mN·m |
| 0x6073 | Max current | 8000 mA | 3000 mA |
| 0x6076 | Motor rated torque / force | 11000 mN | 600 mN·m |
| 0x607D:02 | Max position limit | 395000 (395 mm) | 100000 (100 rev) |
| 0x607F | Max profile velocity | 2000000 | 8000 |
| 0x6080 | Max motor speed | 2000000 | 8000 |
| 0x6081 | Profile velocity | 100000 | 2000 |
| 0x6083 / 0x6084 | Acceleration / deceleration | 5000000 | 20000 |
| 0x6087 | Torque / force slope | 5000 | 1000 |
| 0x6099:01 | Homing search speed | 30000 | 1000 |
| 0x609A | Homing acceleration | 3000000 | 10000 |
| 0x2002:02 | Over-current filter time | 10 ms | 100 ms |
| 0x2113:01 | Velocity loop bandwidth | 40 Hz | 50 Hz |
| 0x2130 | Block-detection parameters | defaults provided | all 0 (must be configured) |
Object existence: lin has mover mass / load mass (0x2110 / 0x2111); stp42 has position/velocity encoder resolution (0x608F / 0x6090) and rotor inertia / load inertia ratio (0x2210 / 0x2211).
Motor temperature protection requires a motor temperature sensor; without temperature sampling the 0x2003 thresholds and the 0x4310 fault do not trigger.
Control Loop Tuning
The driver uses a cascaded position (P) → velocity (PI) → current (PI) structure. Each loop can be tuned in one of two ways, selected by the bandwidth object’s :02 Tuning mode:
| Method | Value | Description |
|---|---|---|
| Bandwidth (default) | 1 | PI gains are computed from the bandwidth and written back to the standard gain objects |
| Manual | 0 | The standard gain object values are used directly |
| Loop | Bandwidth object | Default bandwidth | Gain objects |
|---|---|---|---|
| Current d/q | 0x2112:01 | 1000 Hz | 0x60F6:01 (Kp) / :02 (Ki) |
| Velocity | 0x2113:01 | 50 Hz | 0x60F9:01 (Kp) / :02 (Ki) |
| Position | 0x2114:01 | 15 Hz | 0x60FB:01 (Kp) |
| Encoder PLL | 0x2115:01 | 1000 Hz | — |
- In bandwidth mode, reading 0x60F6 / 0x60F9 / 0x60FB gives the currently active gains; gains are stored as 1000× the internal value.
- To trim a single gain, write the corresponding
:02to 0 for manual mode, then write the gain object. - Tuning parameters take effect immediately, with no reset required.
Recommendations
- Order the bandwidths from high to low: current > velocity > position (defaults 1000 / 50 / 15 Hz).
- Run calibration or fill in the inertia/mass before tuning the velocity loop; the current loop depends on the motor resistance/inductance.
- If vibration or noise appears, lower the velocity-loop bandwidth first.
- After confirming the overall response in bandwidth mode, switch to manual mode to fine-tune Kp / Ki.
Write 0x2113:01 = 60 # velocity bandwidth 50 → 60 Hz, PI recomputed
Read 0x60F9:01 # active Kp
Read 0x60F9:02 # active Ki
Write 0x2113:02 = 0 # switch to manual mode
Write 0x60F9:01 = 350 # Kp = 0.35
Real-Time Feedback
| Object | Content | Unit |
|---|---|---|
| 0x6064 / 0x6062 / 0x60F4 | Position actual / demand / following error | User units |
| 0x606C / 0x606B | Velocity actual / demand | User units/s |
| 0x6077 / 0x6074 | Torque actual / demand | mN (lin) / mN·m (stp42) |
| 0x2000:01 | DC bus voltage | 0.1 V |
| 0x2000:02 | Output current | mA |
| 0x2000:03 | Motor temperature | 0.1 °C |
Polarity (0x607E)
0x607E reverses the sign between the master (network side) and the driver (internal control side), using the standard CiA 402 bit layout:
| Bit | Mask | Meaning | Active modes |
|---|---|---|---|
| 7 | 0x80 |
Position polarity | PP / IP / CSP |
| 6 | 0x40 |
Velocity polarity | PV / CSV |
| 5 | 0x20 |
Torque polarity | PT / CST |
When set, the corresponding command and actual value are inverted together, so the master still sees command and feedback as consistent (following error zero) while the motor moves in the opposite physical direction. The 0x607D software limit applies in the physical frame, so make the limits symmetric when polarity is set. The low 5 bits are reserved and must be written 0.
Typical Sequences
Examples below use read/write object:subindex for SDO access. Node ID defaults to 1.
Enable (prerequisite for all modes)
Write 0x6040:00 = 0x0006 # Shutdown
Write 0x6040:00 = 0x0007 # Switch on
Write 0x6040:00 = 0x000F # Enable operation → 0x6041 = 0x0027
PP positioning (absolute)
Write 0x6060:00 = 1 # select PP
Write 0x6081:00 = 100000 # profile velocity, 100 mm/s
Write 0x6083:00 = 5000000 # acceleration
Write 0x6084:00 = 5000000 # deceleration
Write 0x607A:00 = 250000 # target position, 250 mm
Write 0x6040:00 = 0x001F # bit4 new set-point + bit5 immediate + enable bit
# poll 0x6041: bit12 set-point acknowledge → bit10 reached; bit11 limit; bit13 following error
Relative positioning: add bit6 (0x005F); queue instead of immediate: bit5 = 0.
PV forward/reverse (±100 mm/s)
Write 0x6060:00 = 3 # select PV
Write 0x6083:00 = 5000000
Write 0x6084:00 = 5000000
Write 0x60FF:00 = 100000 # +100 mm/s
# wait for 0x6041 bit10
Write 0x60FF:00 = -100000 # reverse
Write 0x60FF:00 = 0 # stop
Write 0x6040:00 = 0x0006 # disable → ready
CSP cyclic synchronous (see the PDO mapping example above)
Write 0x6060:00 = 8 # select CSP
Write 0x607F:00 = 2000000 # max profile velocity (0 = pure position tracking)
# the master sends [0x607A][0x60B1] frames at a fixed rate
Homing
Write 0x2130:01 = 1000 # force limit 1.0 A
Write 0x2130:02 = 700 # collision current threshold 0.7 A
Write 0x2130:03 = 2000 # following-error threshold 2.0 mm
Write 0x2130:04 = 50 # conditions must hold 50 ms
Write 0x2130:05 = 3000 # retract 3.0 mm
Write 0x607C:00 = 0 # home offset
Write 0x6099:01 = 30000 # search speed, 30 mm/s
Write 0x609A:00 = 3000000 # homing acceleration
Write 0x6060:00 = 6 # select HM
Write 0x6040:00 = 0x001F # bit4 = 1 starts homing (bit8 = 0)
# sequence: bit12 block hit → automatic retract → bit10 homing complete
Write 0x6040:00 = 0x000F # clear bit4
Notes
- Operational on power-up: do not assume a Pre-operational start.
- Enable before selecting a mode: 0x6060 is accepted only in Operation enabled; otherwise 0x6061 does not update.
- Ready is the safe state: the power stage is off in Ready / Switched on. To finish, zero the target, then send Shutdown (
0x0006) and confirm the status word returns to0x0021. - The status word holds the previous state during a stop ramp: with a non-zero option code the transition is deferred; wait for the final status word instead of assuming an immediate transition.
- Fault-reset pulses are not lost: a short reset pulse during Fault reaction active is latched and applied after the drive enters Fault.
- Protection faults are sticky: a manual Fault reset is required, and the fault trips again if the root cause remains.
- PDO mappings are empty by default: configure them at runtime; disable the PDO first (COB-ID bit31 = 1) and enable it after changing mappings and communication parameters.
- The 0x1017 heartbeat time is persistent: it survives power-off; write 0 explicitly when the bus must stay quiet.
- Changing control-loop parameters while the motor moves may cause a disturbance; adjust them while stopped or lightly loaded.
