{
  "spec_version": 1,
  "slug": "eurotherm-3200",
  "manufacturer": "Eurotherm",
  "model": "3200 series temperature/process controller (3204, 3208, 3216)",
  "category": "Temperature controller",
  "supplier_url": "https://www.eurotherm.com/products/temperature-controllers/single-loop-temperature-controllers/3200-temperature-process-controller/",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "None",
      "baud_rate": 9600,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 1,
      "count": 1,
      "name": "PV (temperature) input value",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Process value. Engineering units with an implied decimal point taken from the instrument's display resolution; for writes over Modbus see the Comms PV value at address 203. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Target set-point",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Target set-point with implied decimal point. The document warns not to write continuously changing values (limited EEPROM write cycles); use the remote set-point at address 26 for ramping. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 3,
      "count": 1,
      "name": "Manual output value",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Manual output power, 0-100 % (with implied decimal point). Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 4,
      "count": 1,
      "name": "Working output",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Current working output power. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 5,
      "count": 1,
      "name": "Working set-point",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Working set-point (read only). Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 6,
      "count": 1,
      "name": "Proportional band",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Proportional band, 0.1 to 999.9 in display units."
    },
    {
      "address": 7,
      "count": 1,
      "name": "Control action",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = reverse acting, 1 = direct acting."
    },
    {
      "address": 8,
      "count": 1,
      "name": "Integral time",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Integral time constant; 0 = no integral action. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 9,
      "count": 1,
      "name": "Derivative time",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Derivative time constant; 0 = no derivative action. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 11,
      "count": 1,
      "name": "Input range low limit",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Scale range lower limit. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 12,
      "count": 1,
      "name": "Input range high limit",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Scale range upper limit. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 13,
      "count": 1,
      "name": "Alarm 1 threshold",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Alarm 1 trip level. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 14,
      "count": 1,
      "name": "Alarm 2 threshold",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Alarm 2 trip level. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 15,
      "count": 1,
      "name": "Active set-point select",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = set-point 1, 1 = set-point 2."
    },
    {
      "address": 16,
      "count": 1,
      "name": "Channel 2 deadband",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Deadband between heating and cooling outputs. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 17,
      "count": 1,
      "name": "Cutback low",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Cutback low limit. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 18,
      "count": 1,
      "name": "Cutback high",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Cutback high limit. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 19,
      "count": 1,
      "name": "Relative cool / channel 2 gain",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Relative cooling gain for the second output channel. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 21,
      "count": 1,
      "name": "Motor travel time",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Valve motor travel time (position-proportional models). Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 23,
      "count": 1,
      "name": "Timer status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = reset, 1 = run, 2 = hold, 3 = end."
    },
    {
      "address": 24,
      "count": 1,
      "name": "Set-point 1",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Set-point 1, with implied decimal point. Do not write continuously (EEPROM write limit); use the remote set-point at 26. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 25,
      "count": 1,
      "name": "Set-point 2",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Set-point 2, with implied decimal point. Do not write continuously (EEPROM write limit). Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 26,
      "count": 1,
      "name": "Remote (comms) set-point",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Remote set-point used when remote-setpoint selection is active (address 276). Must be refreshed at least every ~5 s or the controller falls back to the selected local set-point with a remote-SP failure. Not saved at power-off and safe to write continuously. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 27,
      "count": 1,
      "name": "Local trim",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Trim added to the remote set-point to compensate for local temperature variation. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 28,
      "count": 1,
      "name": "Manual reset",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Manual reset value. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 30,
      "count": 1,
      "name": "Output high limit",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Maximum output power, 0-100 %. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 31,
      "count": 1,
      "name": "Output low limit",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum output power, 0-100 %. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 34,
      "count": 1,
      "name": "Safe output value",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Output value used on sensor break or other fault conditions. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 35,
      "count": 1,
      "name": "Set-point rate limit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Set-point rate limit; 0 = no limit. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 39,
      "count": 1,
      "name": "Calculated error",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Calculated error, PV - SP. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 47,
      "count": 1,
      "name": "Alarm 1 hysteresis",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Alarm 1 hysteresis. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 68,
      "count": 1,
      "name": "Alarm 2 hysteresis",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Alarm 2 hysteresis. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 69,
      "count": 1,
      "name": "Alarm 3 hysteresis",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Alarm 3 hysteresis. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 71,
      "count": 1,
      "name": "Alarm 4 hysteresis",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Alarm 4 hysteresis. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 75,
      "count": 1,
      "name": "Instrument status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bitmap: B0 alarm 1, B1 alarm 2, B2 alarm 3, B3 alarm 4, B4 auto/manual, B5 sensor break, B6 loop break, B7 CT low load current, B8 CT high leakage current, B9 program end, B10 PV over-range (>5 % span), B11 CT overcurrent, B12 new alarm, B13 timer/ramp running, B14 remote set-point fail, B15 auto-tune. 1 = active."
    },
    {
      "address": 111,
      "count": 1,
      "name": "Set-point high limit",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Upper limit for the set-point. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 112,
      "count": 1,
      "name": "Set-point low limit",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Lower limit for the set-point. Values assume integer resolution mode; in full-resolution mode multiply the reading by 10^-dp."
    },
    {
      "address": 131,
      "count": 1,
      "name": "Instrument comms address",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Modbus device (slave) address, 1-254."
    }
  ],
  "combined_registers": [],
  "notes": "Sources: Eurotherm \"3200 Series - User Manual\", part number HA028651 issue 15.0, December 2015, sections 15.2 (digital communications parameters, factory defaults) and 15.6 (parameter Modbus addresses), https://www.eurotherm.com/?wpdmdl=27913; and Eurotherm \"2000 Series MODBUS and EI-BISYNCH Handbook\", HA026230 issue 3, June 2011, sections 3.3, 3.4, 3.6 and 4.3, https://www.eurotherm.com/?wpdmdl=27877. Factory defaults from the 3200 communications table: address 1, baud rate 9600, parity none; the same table fixes the data length to 8 bits and one stop bit for Modbus (HA026230: \"a start bit, eight data bits, a parity bit and one or two stop bits; all Series 2000 instruments use 1 stop bit\"). Addressing: HA026230's worked frame reads \"parameter address 1\" with start address 0x0001, so the printed decimal parameter address is sent unchanged (zero-based). Values are 16-bit integers and the decimal point is not transmitted: HA026230 §3.5 allows integer mode (rounded) or full resolution, where the point is implied and the conversion factor must be known to both ends. No factory resolution is stated, so this seed assumes integer resolution and keeps scale 1 on the engineering values (each affected row says so); at full resolution multiply the reading by 10^-dp. Proportional band (0.1-999.9) keeps 0.1. Access is not printed per row in the source; read-only rows (PV, working output, working set-point, calculated error, instrument status, timer status) follow the document's own wording (\"Read Only\" for working set-point). Omitted on purpose: the parameter rows after address 71 whose names and addresses are printed as separate stacked columns in the source (79-107, 122, 141-146, 199-333) cannot be paired reliably and are left out, as are the recipe/timer/programmer blocks and the 12551 broadcast retransmission register. The instrument's EEPROM has a limited number of writes (100,000) - the document warns not to write set-points continuously; use address 26 for ramping."
}
