Therma TH 9XMP Modbus register map
Also covers TH 90MP, TH 91MP, TH 92MP, TH 93MP
Programmable modulating controller (ramps and soaks): process value, set points, alarms, PID settings, program execution, calibration values and identity registers, over Modbus RTU
- Official
- 86 registers
- Modbus RTU
- Revision 1 · 2026-11-10
Official: Written from the manufacturer's documentation, but not tested on a device yet. Check the map against the manufacturer's documentation before you write to a live device. Tested it? Report a test.
Communication
- Protocol
- Modbus RTU
- Unit ID
- 1
- Serial
- 9600 8N1 · 9600 baud, 8 data bits, none parity, 1 stop bit
- Byte / word order
- ABCD · bytes big-endian, words high first
- Addresses
- 1-based · wire address = address − 1
Connection values are defaults: the device may be configured differently.
Map
- Registers
- 86 holding registers
- Groups
- 9
- Translation tables
- 2
- Revision
- 1 · 2026-11-10
- Added
- ()
- File
- maps/therma/th9xmp.mbmap.json · 17 KB · history
- SHA-256
- 7b27be48b9ac366c2dd6df8a469b54abf7eb60da2889fdf6de0e94592cffa703
- Manufacturer
- therma.com.br
Sources and notes
- Controladores Microprocessados Modulantes Programáveis, TH 90MP / 91MP / 92MP / 93MP (Manual de Operação) · version 6ª edição (agosto de 2019), 2019-08 linked in issue #122; chapter Protocolo de Comunicação MODBUS RTU, pages 38 to 42
Source: Controladores Microprocessados Modulantes Programáveis TH 90MP, TH 91MP, TH 92MP, TH 93MP (Manual de Operação), 6ª edição (agosto de 2019)
- Modbus RTU on the optional RS-485 port. The manual lists registers 40001 to 40105 (function codes 03, 06 and 16, no broadcast); they are numbered from 1 here, so address 40001 is register 1 and address_base is 1. Reading a reserved address returns 0xFFFF. The manual does not name the factory baud rate, parity or controller number: 9600, no parity and 1 are placeholders. Options are 2400, 4800 or 9600 bit/s, no, odd or even parity, 8 data bits and 1 stop bit.
- The register table in this edition skips addresses 40025 to 40046 (the page that should list them repeats the first page), so those registers are not included (RP-series controllers have registers there, but the layout may differ).
- Values are 16-bit integers, signed where the range includes negative numbers. The manual does not say how decimals are sent: check against the display before applying a scale.
- Packed BCD registers (CFPR, SEGP and AL xy) are read in hexadecimal. The relay bit order of register 40007 differs from the TH 9XRP manual. The parity codes (0 = none, 1 = odd, 2 = even) are as printed in this manual, whose label for 0 reads NOME (probably none); the TH 9XRP manual lists even before odd.
- Registers 40071 to 40088 act on the segment chosen with PTN and SEGC, and apply only to the programmable series. Registers 40092 to 40099 are calibration values; do not write them without the manual's calibration procedure.
- The software version, model number (A and B) and serial number (A, B and C) are plain 16-bit numbers; the manual does not say how they are formed. Written from the manufacturer's manual; not tested on a device.
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| HR | 1 | int16 | R | Measured value; decimals depend on the input type (see notes) | |||
| HR | 2 | int16 | R | Active set point, between LSPL and USPL | |||
| HR | 3 | int16 | RW | Alarm 1 set point; the allowed range depends on the alarm mode ALD1 | |||
| HR | 4 | int16 | RW | Alarm 2 set point; the allowed range depends on the alarm mode ALD2 | |||
| HR | 5 | int16 | RW | Alarm 3 set point; the allowed range depends on the alarm mode ALD3 | |||
| HR | 6 | uint16 | RW | 0 to 9999 | |||
| HR | 7 | bool bit 0 | R | ||||
| HR | 7 | bool bit 1 | R | ||||
| HR | 7 | bool bit 2 | R | ||||
| HR | 7 | bool bit 3 | R | ||||
| HR | 7 | bool bit 4 | R | ||||
| HR | 7 | bool bit 5 | R | ||||
| HR | 7 | bool bit 6 | R | ||||
| HR | 7 | bool bit 7 | R | ||||
| HR | 8 | uint16 | R | ||||
| HR | 9 | uint16 | R | % | Output level, 0 to 100 % | ||
| HR | 10 | uint16 | RW | Write 1 to store the settings written over Modbus; 0 = do not save | |||
| HR | 11 | uint16 | R | Remote set point, or the current set point of a programmable controller | |||
| HR | 12 | uint16 | R | Minutes left on a timed alarm (ALD = 9) | |||
| HR | 13 | uint16 | R | Minutes left on a timed alarm (ALD = 9) | |||
| HR | 14 | uint16 | R | Minutes left on a timed alarm (ALD = 9) | |||
| HR | 15 | uint16 | RW | ||||
| HR | 16 | uint16 | RW | 0 to 100 | |||
| HR | 17 | uint16 | RW | ||||
| HR | 18 | uint16 | RW | 0 to 3600 | |||
| HR | 19 | uint16 | RW | 0 to 900 | |||
| HR | 20 | uint16 | RW | ||||
| HR | 21 | uint16 | RW | 5 to 500 | |||
| HR | 22 | uint16 | RW | 0 to 10 | |||
| HR | 23 | uint16 | RW | 0 to 2000 | |||
| HR | 24 | uint16 | RW | 0 to 3600 | |||
| HR | 47 | uint16 | RW | ||||
| HR | 48 | int16 | RW | Between LSPL and USPL | |||
| HR | 51 | uint16 | RW | 0 to 5 | |||
| HR | 52 | int16 | RW | -1999 to +9999 | |||
| HR | 53 | int16 | RW | -1999 to +9999 | |||
| HR | 54 | uint16 | R | Ambient temperature reading, 0 to 50 | |||
| HR | 55 | uint16 | RW | 0 to 100 | |||
| HR | 56 | uint16 | RW | Start of the analog input signal 1 (hexadecimal, see the manual's calibration mode) | |||
| HR | 57 | uint16 | RW | End of the analog input signal 1 (hexadecimal, see the manual's calibration mode) | |||
| HR | 58 | uint16 | RW | Start of the analog input signal 2 (remote) (hexadecimal, see the manual's calibration mode) | |||
| HR | 59 | uint16 | RW | End of the analog input signal 2 (remote) (hexadecimal, see the manual's calibration mode) | |||
| HR | 60 | uint16 | RW | s | Closed-to-open time of the motor, 5 to 200 s | ||
| HR | 61 | uint16 | RW | Start of control analog output 1, 0 to 100 | |||
| HR | 62 | uint16 | RW | End of control analog output 1, 0 to 100 | |||
| HR | 63 | uint16 | RW | Start of control analog output 2, 0 to 100 | |||
| HR | 64 | uint16 | RW | End of control analog output 2, 0 to 100 | |||
| HR | 65 | uint16 | RW | 0 to 4095 | |||
| HR | 66 | uint16 | RW | 0 to 4095 | |||
| HR | 67 | uint16 | RW | ||||
| HR | 68 | uint16 | RW | ||||
| HR | 71 | uint16 | RW | Packed BCD, read as hex; see the manual | |||
| HR | 72 | uint16 | RW | 1 to 8 | |||
| HR | 73 | uint16 | R | ||||
| HR | 74 | uint16 | R | 0 to 8 | |||
| HR | 75 | uint16 | RW | 0 to 9999 | |||
| HR | 76 | uint16 | RW | ||||
| HR | 77 | uint16 | RW | ||||
| HR | 78 | uint16 | RW | Packed BCD, read as hex; low digits 1 to 8 | |||
| HR | 79 | uint16 | RW | ||||
| HR | 80 | uint16 | RW | ||||
| HR | 81 | uint16 | RW | 1 to 8 | |||
| HR | 82 | uint16 | RW | 1 to 8 | |||
| HR | 83 | int16 | RW | Set point of the selected segment | |||
| HR | 84 | uint16 | RW | 0 to 9999 | |||
| HR | 85 | uint16 | RW | 0 to 100 % | |||
| HR | 86 | uint16 | RW | 5 to 9999 | |||
| HR | 87 | uint16 | RW | Packed BCD, read as hex: one digit per alarm relay (A = AL1, B = AL2, C = AL3, D = 0) | |||
| HR | 88 | uint16 | RW | ||||
| HR | 89 | uint16 | RW | 1 to 127; changing it ends communication on the current address | |||
| HR | 90 | uint16 | RW | ||||
| HR | 91 | uint16 | RW | ||||
| HR | 92 | uint16 | RW | Calibration value; see the manual's calibration mode | |||
| HR | 93 | uint16 | RW | Calibration value; see the manual's calibration mode | |||
| HR | 94 | uint16 | RW | Calibration value; see the manual's calibration mode | |||
| HR | 95 | uint16 | RW | Calibration value; see the manual's calibration mode | |||
| HR | 96 | uint16 | RW | Calibration value; see the manual's calibration mode | |||
| HR | 97 | uint16 | RW | Calibration value; see the manual's calibration mode | |||
| HR | 98 | uint16 | R | Hexadecimal, read only | |||
| HR | 99 | uint16 | R | Hexadecimal, read only | |||
| HR | 100 | uint16 | R | Plain 16-bit number; how it maps to a version string is not stated | |||
| HR | 101 | uint16 | R | First part of the model number | |||
| HR | 102 | uint16 | R | Second part of the model number | |||
| HR | 103 | uint16 | R | First part of the serial number | |||
| HR | 104 | uint16 | R | Second part of the serial number | |||
| HR | 105 | uint16 | R | Third part of the serial number |
No registers match
Try part of the name, an address (decimal or 0x hex) or clear the filters.
Help improve this map
- I tested it on a deviceReport whether it worked, even if you did not write the map.
- Suggest a correctionEdit the file on GitHub; it opens a pull request.
- Report a problemA wrong address, type, scale or byte order.
- Read the formatWhat each key of the file means (SPEC.md).