# Property of PMA Electrical Solutions, LLC. # # Eaton SVX9000 / SPX9000 (9000X series) via the **OPTE2 / OPTE8 RS-485 option # board** in Modbus RTU mode. The 9000X has no Modbus on the base unit; this # profile is meaningless without that board. # # The OPTE2 manual addresses the "Eaton SPX/SVX family" as one platform and its # control/status word support tables list SPX and SVX in a single column, so # both are claimed here. Nothing beyond that family is. # # SOURCES — Eaton primary documentation only: # MN040064EN (11/23) "OPTE2-E8-RS485-Board" user manual # printed p. 19 option board menu: baud rate default, communication # timeout default, NX mode # printed p. 21 section 7.2.1, the addressing rule # printed p. 22 Table 14, function codes and address ranges # printed p. 23 Table 16, Modbus register mapping to drive IDs # printed p. 25 the worked 32-bit example quoted below # printed pp. 26-27 Tables 18 and 22, FB process data IN and OUT # printed p. 48 Table 42, FBFixedControlWord bit support # printed p. 49 Tables 43-44, FBFixedStatusWord bits and support # printed p. 50 section 10.6, speed reference and actual speed scaling # printed p. 52 Table 47, process data mapping defaults and scales # MN04001004E "SVX9000/SPX9000 AF Drives User Manual" # printed pp. 81-84 the fault code list below # # ############ ADDRESSING — THE ONE THING TO CHECK BEFORE ANYTHING ELSE ######## # The OPTE2 manual gives exactly one normative statement about addressing, in # section 7.2.1: "All data addresses in Modbus messages are referenced to zero # ... Holding register 40001 is addressed as register 0000 ... Holding register # 40108 is addressed as register 006B hex (107 decimal)." # # Everywhere else it uses bare index numbers — Table 16 lists "0001-2000 Eaton # Application IDs", "2001-2050 FBProcessDataIN" — and never restates whether # those bare numbers are already zero-referenced. This profile applies 7.2.1 # consistently, because it is the only rule the manual actually states: # 0-based protocol address = the manual's index number - 1 # FB Control Word index 2001 -> 2000 # FB Status Word index 2101 -> 2100 # Application ID 1 (Output frequency) -> 0 # # THE ALTERNATIVE READING IS LIVE. If Eaton means those bare numbers as protocol # addresses already (the Vacon heritage this board comes from often does), every # address here is one too low. VERIFY BEFORE ARMING: read the FB Status Word at # 2100 with the motor stopped and the drive healthy. Bit 0 "Ready" should be 1 # and bit 1 "Run" should be 0. If instead you get a value that looks like a # speed or a zero, read 2101 and compare — if 2101 is the sensible one, add 1 to # every address in this file. Do NOT skip this on a live bus: the same # off-by-one moves the command register from 2000 to 2001, and index 2002 is # the FB General Control Word. # ############################################################################# # # 32-BIT ACCESS AND WORD ORDER. The manual's worked example (printed p. 25) is # the only place it shows both words of a 32-bit value: # "Modbus address 25102 (low data) becomes from calculation '32-bit area # start address' + (application ID * 2) = 20000 + (2551 * 2)" # "Modbus index 25101 value: 23442 (0x5B92)" <- HIGH word, lower index # "Modbus index 25102 value: 20961 (0x51E1)" <- LOW word, higher index # So a 32-bit value is HIGH word first, which is core's default word_order and # is why no point below overrides it. Nothing in this profile currently uses the # 32-bit area; the rule is recorded for whoever adds one. # # DRIVE-SIDE SETUP — without these the drive ACKs writes and ignores them: # Control word bit 8 [Request Fieldbus Control] and bit 9 [Request Fieldbus # Reference] must be set for the drive to take command and reference from the # bus. They are part of every run sequence below rather than a separate step, # because a run command without them is silently discarded. # Bit 15 [Master connected] is likewise asserted throughout. # Board menu (printed p. 19): Slave address 1-247, Baud rate default 9600, # Mode 1 = Normal (2 = NX mode emulates the older OPTC2/OPTC8 board and # changes the map — this profile assumes Normal). name = "Eaton SVX9000 / SPX9000" vendor = "Eaton" device_type = "vfd" verified = false probe_register = 2100 # FB Status Word, readable whenever the board is alive [connection] summary = "Install OPTE2 or OPTE8 in the SPX/SVX option slot; both support this map in Normal mode but use different connectors." warnings = ["Isolate and discharge the drive before opening it or installing an option board.", "Do not use OPTC2/OPTC8 pinouts: Eaton explicitly swapped plus/minus pin positions on the newer OPTE boards."] [[connection.methods]] id = "opte2_screw" title = "OPTE2 5-pin screw connector" transport = "serial" hardware = "option" port = "OPTE2 pins 3 RxD/TxD-P(B+), 4 RxD/TxD-N(A-), optional 5 DGND and 1 shield" connector = "5-pin pluggable bus connector" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted-pair RS-485 cable" parts = ["OPTE2 option board", "5-pin plug", "Endpoint termination/bias jumpers"] wiring = [{ adapter = "D+ / B+", device = "Pin 3, RxD/TxD-P (B)", signal = "RS-485 positive" }, { adapter = "D- / A-", device = "Pin 4, RxD/TxD-N (A)", signal = "RS-485 negative" }, { adapter = "COM/GND", device = "Pin 5, DGND", signal = "Data reference", required = false }, { adapter = "Cable shield", device = "Pin 1, Shield", signal = "Shield bond", required = false }] steps = ["Isolate the drive and install OPTE2 in the supported SPX/SVX option slot.", "Land positive on pin 3 and negative on pin 4; use pins 5/1 only for the documented reference/shield paths and leave pin 2 VP unconnected.", "Set termination/bias for this node's bus position and route the shielded cable per the board manual.", "Close the drive, restore power, and select the serial adapter."] setup = ["Set board slave address, baud/parity/stop bits, timeout, and Mode = 1 Normal.", "Keep control-word fieldbus-control, fieldbus-reference, and master-connected bits asserted."] warnings = ["NX compatibility mode changes the map and is not supported by this profile."] source = "Eaton MN040064EN, printed pp. 8, 11-20, and 33" [[connection.methods]] id = "opte8_dsub" title = "OPTE8 female D-sub" transport = "serial" hardware = "option" port = "OPTE8 pins 3 RxD/TxD-P(B+), 4 RxD/TxD-N(A-), optional 5 DGND and 1 shield" connector = "9-pin female D-sub using Eaton's non-PC pinout" adapter = "Isolated USB-to-RS-485 adapter plus custom cable to Eaton OPTE8 pinout" cable = "Shielded twisted pair in a D-sub shell" parts = ["OPTE8 option board", "Male D-sub plug/shell", "Endpoint termination/bias jumpers"] wiring = [{ adapter = "D+ / B+", device = "D-sub pin 3, RxD/TxD-P (B)", signal = "RS-485 positive" }, { adapter = "D- / A-", device = "D-sub pin 4, RxD/TxD-N (A)", signal = "RS-485 negative" }, { adapter = "COM/GND", device = "D-sub pin 5, DGND", signal = "Data reference", required = false }, { adapter = "Cable shield", device = "D-sub pin 1", signal = "Shield bond", required = false }] steps = ["Isolate the drive and install OPTE8 in the supported option slot.", "Use a cable built to Eaton's OPTE8 pinout: positive pin 3, negative pin 4, optional reference pin 5, shield pin 1.", "Set termination/bias for the bus location and leave pin 2 VP unconnected.", "Close the drive, restore power, and select the serial adapter."] setup = ["Set the option-board serial parameters and Mode = 1 Normal.", "Retain the required fieldbus request/master-connected control-word bits."] warnings = ["A generic PC serial/null-modem D-sub cable is not suitable.", "OPTC8 uses different data-pin assignments."] source = "Eaton MN040064EN, printed pp. 9, 11-20, and 33" # MN040064EN printed p. 19: "Default baud rate is 9600 bps." The same menu # carries parity and stop bits with a "None, 1 stop bit" option; the manual does # not print which parity is factory-set, so 8N1 is assumed and should be # confirmed on the board menu. Wrong serial settings cost a link, not a motor. [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # FBFixedStatusWord, MN040064EN Table 43 (printed p. 49). Table 44 confirms # SPX/SVX support bits 0-7; bit 8 "Info" is listed as NOT supported on this # family and bits 9-15 are reserved, so neither is named here. # Bit 2: 0 = clockwise, 1 = counterclockwise. status_word = { address = 2100, bits = { 0 = "Ready", 1 = "Run", 2 = "DirectionCCW", 3 = "Fault", 4 = "Alarm", 5 = "AtReference", 6 = "ZeroSpeed", 7 = "FluxReady" } } # FBGeneralStatusWord — "totally application specific and can vary even in # Eaton standard applications" (printed p. 49), so no bits are named for it. general_status_word = { address = 2101 } # FB Actual Speed, index 2103. Signed -10000...10000 = -100.00%...100.00% # scaled BETWEEN the minimum and maximum frequency parameters, not as a # fraction of maximum alone (printed p. 50). actual_speed = { address = 2102, scale = 0.01, signed = true, unit = "%" } # # Application IDs with the scales Eaton publishes in Table 47 (printed p. 52). # These are the process-data-out defaults, and the scale column there is the # authority — the panel display format is not. # NOTE the current ID is 45, not 3. Table 47 maps PD out 3 to application ID 45. output_frequency = { address = 0, scale = 0.01, signed = true, unit = "Hz" } # ID 1 motor_speed = { address = 1, signed = true, unit = "rpm" } # ID 2 motor_torque = { address = 3, scale = 0.1, signed = true, unit = "%" } # ID 4 motor_power = { address = 4, scale = 0.1, signed = true, unit = "%" } # ID 5 motor_voltage = { address = 5, scale = 0.1, unit = "V" } # ID 6 dc_link_voltage = { address = 6, unit = "V" } # ID 7 motor_current = { address = 44, scale = 0.1, unit = "A" } # ID 45 # FBFixedControlWord, index 2001. MN040064EN Table 42 (printed p. 48) gives the # bits SPX/SVX actually support: # 0 Start/Stop 1 Direction (1 = counterclockwise) 2 Fault reset # 8 Request Fieldbus Control 9 Request Fieldbus Reference # 15 Master connected # Bits 3-7 are Fieldbus DIN1-5 on this family (Table 41), NOT the stop-mode and # ramp functions they carry on other Eaton drives — marked "o) FBDIN function # instead of standard function". Nothing here touches them. # Bits 10-12 (Jogging 1/2, Quick stop) are not marked as supported on SPX/SVX # and are deliberately unused. # # Every sequence below carries 0x8300 = bit 15 | bit 9 | bit 8, i.e. master # connected plus the two fieldbus-ownership requests. Dropping them hands # command back to the terminal block mid-run. [control] command_register = 2000 step_delay = 0.05 # Ownership asserted, Start/Stop bit clear. stop = [0x8300] # Ownership plus bit 0 Start. Direction bit clear = clockwise. run_fwd = [0x8300, 0x8301] # Same with bit 1 Direction set = counterclockwise. Distinct from forward # because direction is a real command bit here — but see the reference note # below, because the sign of the reference interacts with it. run_rev = [0x8300, 0x8303] # Bit 2 Fault reset, pulsed. Bit 0 Start is clear in every step, so this reset # value is not a run command. reset = [0x8300, 0x8304, 0x8300] # FB Speed Reference, index 2003. Signed -10000...10000 at 0.01% resolution, # where 0 = the MINIMUM frequency parameter and 10000 = the MAXIMUM frequency # parameter (printed p. 50). So 0% is not necessarily 0 Hz — on a drive with a # non-zero minimum frequency, writing 0 still turns the motor. # A NEGATIVE reference also means direction, and it beats the control word: # "If the direction bit in control word is set ... and the reference is # negative, motor runs clockwise despite the direction bit." Keep the reference # non-negative and steer with run_fwd / run_rev, or the two cancel out. speed_register = 2002 speed_scale = 0.01 speed_unit = "%" max_ref = 100.0 # MN040064EN printed p. 19: the board reports a communication timeout fault to # the drive if it receives no request within the timeout, and that fault is F53 # (chapter 13.3, "Fieldbus timeout fault (F53)"). # # READ THIS: THE TIMEOUT IS DISABLED FROM THE FACTORY. The menu default is # "0 = Disable", and the manual states plainly that the board "does not create # communication timeout fault to the drive when the timeout value is set to # zero. This is useful for example when Modbus RTU or N2 is used only for # monitoring." So out of the box this drive behaves like the Danfoss, not like # the ATS48: go quiet mid-run and THE MOTOR KEEPS RUNNING with no fault. # Set the board's Communication timeout to a few seconds before using this # profile for control. The keepalive below is declared either way — it is # harmless when the timeout is disabled and required once it is not. [control.watchdog] interval_ms = 500 fault = "F53 fieldbus timeout (only if the board's Communication timeout is non-zero)" # FBFixedStatusWord bit 1 "Run" — "1 = Motor is running" (Table 43). [running_check] register = 2100 bit = 1 # Application ID 37, "Last active fault code", which Table 47 maps to process # data out 8 by default. The AF user manual gives the fault code range as 1-54 # (printed p. 45), though the list itself runs past that to 56. [faults] register = 36 # MN04001004E printed pp. 81-84. Transcribed only where the code number and its # name were both legible in the vendor table. # DELIBERATELY INCOMPLETE: codes 4, 18, 19, 20, 21, 23, 27, 28, 30, 33, 35, 39, # 42, 44-50 and 55 were not resolved to a name in the pages read and are left # out rather than guessed. Code 50 in particular is an analog-input loss whose # description ("signal source has failed", 4-20 mA range) was legible but whose # code number was not, so it is omitted. Fill these from MN04001004E, not from # a Vacon NX table — the families share heritage but this profile claims Eaton. [faults.codes] 1 = "Overcurrent" 2 = "Overvoltage" 3 = "Ground (earth) fault" 5 = "Charging switch" 6 = "Emergency stop" 7 = "Saturation trip" 8 = "System fault" 9 = "Undervoltage" 10 = "Input line supervision" 11 = "Output phase supervision" 12 = "Brake chopper supervision" 13 = "Drive undertemperature (heatsink below -10 C)" 14 = "Drive overtemperature (heatsink above 90 C)" 15 = "Motor stalled" 16 = "Motor overtemperature" 17 = "Motor underload" 22 = "EEPROM checksum fault" 24 = "Counter fault" 25 = "Microprocessor watchdog" 26 = "Startup prevented" 29 = "Thermistor fault" 31 = "IGBT temperature (hardware)" 32 = "Fan cooling" 34 = "CAN bus communication" 36 = "Control unit" 37 = "Device change (same type)" 38 = "Device added" 40 = "Device unknown" 41 = "IGBT temperature" 43 = "Encoder fault" 51 = "External fault" 52 = "Keypad communication fault" 53 = "Communication bus fault" 54 = "Slot fault" 56 = "PT100 board temperature" # NO [parameters] BLOCK, DELIBERATELY. Table 16 shows the application-ID space # is not one contiguous writable block: 0001-2000 and 2200-10000 are 16-bit # application IDs, 2001-2199 is the process-data image, and 20001-40000 mirrors # the same parameters as 32-bit. Which IDs are writable depends on the # application loaded in the drive ("The parameter addresses are determined in # the application"), so no range is safe without the application manual for the # specific firmware. A restore that walks 0001-2000 blindly would write into # read-only monitoring IDs and NAK, or worse, land in the process-data image. # # NO [rating] BLOCK: the 9000X reports its frame rating through nameplate IDs # that vary by application, and none was confirmed in the documents read.