Electric motor drives on a Cerbo GX: CANopen controllers, NMEA 2000 e-drive PGNs and the motordrive service

How a Victron Cerbo GX reads an electric propulsion motor: the CANopen E-drive driver for Sevcon Gen4, Curtis and DMC controllers (and exactly which objects it polls), the NMEA 2000 e-drive PGNs 128002 and 127490, and where the data ends up on D-Bus, MQTT and Modbus TCP.

TTMH8 min read6 sections
Motors & drives
On this page
  1. Route 1: CANopen E-drive
  2. Route 2: NMEA 2000 E-drive
  3. Route 3: a DC meter as "Electric Drive"
  4. Where the data ends up
  5. Sources
  6. Related reading

Electric motor drives on a Cerbo GX

A Victron GX device can show the propulsion motor next to the batteries — RPM, power, direction, motor and controller temperature — on its Boat page. There are three ways the data gets there, and they look very different on the wire. This guide covers each one down to the messages, so you can check your installation with the log analyzer or read the values from your own code.

RouteForOn the wire
CANopen E-driveSevcon Gen4 AC, Curtis F, Curtis E/SE, DMC Sigma2N controllersGX polls the controller with CANopen SDO reads, 11-bit IDs
NMEA 2000 E-drivedrives with an NMEA 2000 interfacethe drive broadcasts e-drive and engine PGNs, 29-bit IDs
DC meter as "Electric Drive"any motor, via a SmartShunt or similarbattery-side voltage, current, power only

All three end up in the same place: the com.victronenergy.motordrive service.

Route 1: CANopen E-drive

Requirements and wiring

  • Venus OS 3.70 or later.
  • A modified RJ45 cable from the controller's CAN port to a GX VE.Can port: RJ45 pin 3 CAN ground, pin 7 CAN-H, pin 8 CAN-L. Victron's GX manual gives the controller pins — for example Sevcon Gen4: CAN-H on 13 or 16, CAN-L on 24 or 27, ground to B−. All nodes need a common ground; terminate both ends of the bus with 120 Ω.
  • A unique CANopen node ID per controller if there is more than one.

On the GX: Settings → Connectivity → (VE.Can port) → CAN-bus profile, then either VE.Can & CANopen E-drive (250 kbit/s) to share the VE.Can network, or CANopen E-drive (500 kbit/s) for a dedicated bus. Then CANopen E-drives → Scan. Found node IDs are listed and kept across reboots and firmware updates. Tested by Victron: Sevcon Gen4 AC size 4 (size 2 and 6 expected to work, Gen4 DC not tested), Curtis F6-A, Curtis 1232 SE and 1234 E.

What the GX does on the bus

Victron publishes the driver as open source, dbus-canopen-motordrive, which makes it possible to say exactly what happens. (Details below are from the code as of 14 October 2026; they can change between Venus OS versions.)

Discovery. For each node it reads object 0x1008 (manufacturer device name) with a segmented SDO upload. A name containing Gen4 is a Sevcon; one starting AC F is a Curtis F. Curtis E/SE controllers don't implement 0x1008, so on failure the GX reads 0x1018 sub 1 (vendor ID): 0x4349 means Curtis, 0x04F1 means DMC.

Polling. Every 125 ms it reads the motor speed; once a second that read is replaced by a full read of every value. Per controller that is roughly 12–15 SDO requests a second depending on the driver, each with a response — around 25–30 frames a second, worth knowing on a shared 250 kbit/s VE.Can network. The GX also checks for controllers every 10 s.

The objects it reads:

ValueSevcon Gen4Curtis FCurtis E/SEDMC Sigma2N
Battery voltage0x5100 sub 1, u16 × 0.0625 V0x34C1, u16 × 0.01 V0x324C, s16 × 0.015625 V0x383F, s16 × 0.1 V
Battery current0x5100 sub 2, s16 × 0.0625 A0x338F, s16 × 0.1 A0x359E, s16 × 0.1 A0x383E, s16 × 0.1 A
Motor speed0x606C, s16 rpm0x352F, s16 rpm0x3207, s16 rpm0x606C, s32 rpm
Motor temperature0x4600 sub 3, s160x3536, s16 × 0.1 °C0x320B, s16 × 0.1 °C0x3836, byte − 51
Torque0x4602 sub 0x0C, s160x3538, float—0x411C, s16 × 0.1
Controller temperature0x5100 sub 4, s80x3000, s16 × 0.1 °C0x322A, s16 × 0.1 °C0x3837, byte − 51

Power is not read: the GX multiplies voltage by current. Direction comes from the sign of the speed — positive forward, negative reverse, zero neutral — flipped if the controller is configured with reversed direction (Curtis F reads 0x362F, Curtis E/SE 0x306C for this). The Curtis E/SE driver treats speeds within ±25 rpm and currents within ±0.1 A as zero. On a DMC it also reads fault code and sub-code (0x3840, 0x3841).

Reading the traffic yourself

A speed read on a Sevcon at node 1:

601  40 6C 60 00 00 00 00 00     SDO upload request, object 0x606C sub 0
581  4B 6C 60 00 DC 05 00 00     response, 2 bytes: 0x05DC = 1500 rpm

Decode the request and response. The command byte says how many data bytes are valid (4B = 2, 43 = 4, 4F = 1).

The frame decoder shows the raw value; the scaling is device-specific. Battery voltage 0x0340 from 0x5100 sub 1 is 832 × 0.0625 = 52.0 V; battery current 80 FD from sub 2 is signed: −640 × 0.0625 = −40 A (links open the signal calculator with these settings).

A heartbeat 701 05 means node 1 is operational. An SDO response starting 80 is an abort — for example code 0x06020000, object does not exist, which is what a wrong controller type or firmware returns.

Faults. For a Sevcon, the driver reads a fault ID from bytes 3–4 of the controller's emergency (EMCY) message — the manufacturer-specific part — and raises a GX notification for known faults such as 0x4602 device too hot or 0x4D43 motor stalled. If an SDO read fails, the GX drops the controller until its next connection check.

Route 2: NMEA 2000 E-drive

NMEA added electric-propulsion messages to NMEA 2000 in version 3.000. A drive with an NMEA 2000 interface shows up on the GX if it meets Victron's requirements:

Required
Device class50 — Propulsion
Device function155 — Motor, or 160 — Engine gateway
PGNs128002 Electric Drive Status, Rapid Update; 127490 Electric Drive Status, Dynamic; 127488 Engine Parameters, Rapid Update; 127489 Engine Parameters, Dynamic; 127493 Transmission Parameters, Dynamic

Check the device's address claim (PGN 60928) first — class and function are there.

127488, 127489 and 127493 are long-established engine PGNs (speed, temperatures, hours, gear). The two e-drive PGNs are new, and here is the honest state of public documentation: the NMEA's definitions are sold, not published, and the open-source canboat database marks both layouts as unverified. canboat's current reading:

128002 — Electric Drive Status, Rapid Update (single frame):

BytesField (canboat)
0Inverter/motor controller instance
1 bits 0–1 / 2–3Active motor mode / brake mode
2–3Rotational shaft speed, 0.25 rpm
4–5Motor DC voltage, 0.1 V
6–7Motor DC current, signed 0.1 A
09F40210  00 FF C0 12 00 02 52 03     (priority 2, from 0x10)

Decodes as 1200 rpm, 51.2 V, 85 A under canboat's layout — the decoder warns that the layout is unverified.

127490 — Electric Drive Status, Dynamic (fast-packet): identifier, operating mode, then motor, inverter, coolant and gear temperatures (0.01 K) and shaft torque.

Before relying on these fields — for an alarm, say — check them against the drive maker's own documentation, the way MG publishes its energy-storage PGNs.

Route 3: a DC meter as "Electric Drive"

A SmartShunt or other DC meter on the motor's supply can be set to the DC meter type Electric Drive; the GX then publishes it as a motordrive service too. You get battery-side voltage, current and power — no RPM or temperatures — but it works with any motor.

Where the data ends up

D-Bus — com.victronenergy.motordrive, per Victron's D-Bus documentation:

PathMeaning
/Dc/0/Voltage, /Dc/0/Current, /Dc/0/PowerV, A, W — current and power can be negative during regeneration
/Motor/RPMspeed
/Motor/Direction0 neutral, 1 reverse, 2 forward
/Motor/Temperature, /Controller/Temperature, /Coolant/Temperature°C, each optional
/Motor/Torqueoptional

MQTT — the GX's MQTT broker mirrors D-Bus as N/<portal ID>/<service type>/<device instance>/<D-Bus path>, so motor speed is N/<portal ID>/motordrive/<instance>/Motor/RPM. Send a keepalive to R/<portal ID>/keepalive to keep the values flowing.

Modbus TCP — from Victron's register list (attributes.csv):

RegisterPathType, scale
2048/Motor/RPMint16, × 1
2049/Motor/Temperatureint16, × 10 (°C)
2050/Dc/0/Voltageuint16, × 100
2051/Dc/0/Currentint16, × 10
2052/Dc/0/Powerint16, × 10 — stops at 3,276.7 W
2053/Controller/Temperatureint16, × 10 (°C)

The power register's limit is easy to miss on a multi-kilowatt motor: compute power from registers 2050 × 2051 instead.


Sources

Checked on 25 October 2026:

We are not affiliated with Victron Energy, Sevcon (BorgWarner), Curtis Instruments or DMC.


Want exact numbers for your boat?

Use the configurator to generate a vendor-ready spec sheet.

Start the configurator
TPublished by TMHOctober 25, 2026
About & methodology