Modbus Register Maps – GW04
Packet Power Monitoring Node Modbus Register Maps
The Modbus register map defines the way monitoring node readings are mapped onto Modbus register values. Modbus registers are always 16 bits in size, so in some cases larger values are mapped onto sets of multiple registers.
A value mapping requires four elements:
- Register number: the address of the Modbus register (if one register) or first of multiple consecutive registers (if mapping onto multiple registers)
- Monitoring node data channel: the data channel from which the value being mapped is taken
- Scale factor: a multiplier applied to the value; sometimes used to scale the value to avoid using floating point numbers which are not directly supported by Modbus
- Value mapping: the binary byte-level mapping of the scaled value onto one or more 16-bit Modbus registers
Data channels
The data channels are usually self-explanatory (e.g. Voltage [V]). Special, Packet Power-specific data channels are listed below:
- Node type [0-2]: type of monitoring node: 0=unknown, 1=power monitoring node, 2=environmental monitoring node)
- Node OK: node communication status indicator: 0=node is not transmitting, most recent readings or 0 values are reported; 1=node is transmitting OK
Scale factor
The reading value is multiplied by the scale factor before being mapped onto registers. Note that the default values may be smaller than expected. For example, voltage is reported in tenths of a volt, so if your monitoring application expects to see values in full volts, you would need to scale the reading by a factor of 10. Similarly, the scale for energy readings is Watt-hours. If your application expects kilowatt hours, you will need to scale the reading by a factor of 1000.
Mapping
The reading value is converted to a specified binary format, then mapped onto the specified set of 16-bit Modbus registers. The letters in the mapping denote bytes.
Example: “int ABCD (32b) => DC,BA (2 registers)”
The above mapping will take a reading value, scale it, convert it to a 32 bit signed integer, then map it onto 2 consecutive Modbus registers while swapping bytes in each register.
Monitor Specific Register Maps
The Ethernet Gateway Version 4 (EG4) with firmware version 1.12.x or higher has the following register maps resident on the Gateway. For Gateways where the register map is not pre-loaded the register maps can be downloaded and imported onto the Gateway or the Gateway firmware can be updated to 1.12.x where register maps are resident. As noted this is a dynamic map and register numbers can be modified along with custom expressions.
Power Monitoring Registers
Note: not all registers will be applicable to all power monitoring devices.
Register | Expression | Syntax | Multiplier | Unit | Description | Measurement | Value |
100 | R(Energy) * 1 | Energy | 1 | Wh | Total Energy Use | 1Wh | 4 register, big-endian |
102 | R(EnergyA) * 1 | EnergyA | 1 | Wh | Phase A Energy Use | 1Wh | 4 register, big-endian |
104 | R(EnergyB) * 1 | EnergyB | 1 | Wh | Phase B Energy Use | 1Wh | 4 register, big-endian |
106 | R(EnergyC) * 1 | EnergyC | 1 | Wh | Phase C Energy Use | 1Wh | 4 register, big-endian |
202 | R(EnergyExportA) * 1 | EnergyExportA | 1 | Wh | Phase A net energy export | 1Wh | 4 register, big-endian |
204 | R(EnergyExportB) * 1 | EnergyExportB | 1 | Wh | Phase B net energy export | 1Wh | 4 register, big-endian |
206 | R(EnergyExportC) * 1 | EnergyExportC | 1 | Wh | Phase C net energy export | 1Wh | 4 register, big-endian |
300 | R(Ah) * 10 | Ah | 10 | Ah | Amp Hours Total | 0.1Ah | 4 register, big-endian |
302 | R(AhA) * 10 | AhA | 10 | Ah | Amp Hours Channel A | 0.1Ah | 4 register, big-endian |
304 | R(AhB) * 10 | AhB | 10 | Ah | Amp Hours Channel B | 0.1Ah | 4 register, big-endian |
306 | R(AhC) * 10 | AhC | 10 | Ah | Amp Hours Channel C | 0.1Ah | 4 register, big-endian |
308 | R(AhD) * 10 | AhD | 10 | Ah | Amp Hours Channel D | 0.1Ah | 4 register, big-endian |
310 | R(AhE) * 10 | AhE | 10 | Ah | Amp Hours Channel E | 0.1Ah | 4 register, big-endian |
312 | R(AhF) * 10 | AhF | 10 | Ah | Amp Hours Channel F | 0.1Ah | 4 register, big-endian |
402 | R(VAhA) * 10 | VAhA | 10 | VAh | Amp Hours Channel A | 0.1Ah | 4 register, big-endian |
404 | R(VAhB) * 10 | VAhB | 10 | VAh | Amp Hours Channel B | 0.1Ah | 4 register, big-endian |
406 | R(VAhC) * 10 | VAhC | 10 | VAh | Amp Hours Channel C | 0.1Ah | 4 register, big-endian |
408 | R(VAhD) * 10 | VAhD | 10 | VAh | Amp Hours Channel D | 0.1Ah | 4 register, big-endian |
410 | R(VAhE) * 10 | VAhE | 10 | VAh | Amp Hours Channel E | 0.1Ah | 4 register, big-endian |
412 | R(VAhF) * 10 | VAhF | 10 | VAh | Amp Hours Channel F | 0.1Ah | 4 register, big-endian |
450 | R(Power) * 1 | Power | 1 | W | Total Power | 1Wh | 1 register, big-endian |
451 | R(PowerA) * 1 | PowerA | 1 | W | Power Phase A | 1Wh | 1 register, big-endian |
452 | R(PowerB) * 1 | PowerB | 1 | W | Power Phase B | 1Wh | 1 register, big-endian |
453 | R(PowerC) * 1 | PowerC | 1 | W | Power Phase C | 1Wh | 1 register, big-endian |
454 | R(PowerD) * 1 | PowerD | 1 | W | Power Channel D | 1W | 1 register, big-endian |
455 | R(PowerE) * 1 | PowerE | 1 | W | Power Channel E | 1W | 1 register, big-endian |
456 | R(PowerF) * 1 | PowerF | 1 | W | Power Channel F | 1W | 1 register, big-endian |
500 | R(Current) * 10 | Current | 10 | A | Total Current | 0.1A | 1 register, big-endian |
501 | R(CurrentA) * 10 | CurrentA | 10 | A | Current Phase A | 0.1A | 1 register, big-endian |
502 | R(CurrentB) * 10 | CurrentB | 10 | A | Current Phase B | 0.1A | 1 register, big-endian |
503 | R(CurrentC) * 10 | CurrentC | 10 | A | Current Phase C | 0.1A | 1 register, big-endian |
504 | R(CurrentD) * 10 | CurrentD | 10 | A | Current Channel D | 0.1 A | 1 register, big-endian |
505 | R(CurrentE) * 10 | CurrentE | 10 | A | Current Channel E | 0.1 A | 1 register, big-endian |
506 | R(CurrentF) * 10 | CurrentF | 10 | A | Current Channel F | 0.1 A | 1 register, big-endian |
550 | R(CurrentN) * 10 | CurrentN | 10 | A | Current Neutral | 0.1 A | 1 register, big-endian |
600 | R(Voltage) * 10 | Voltage | 10 | V | Average Voltage | 0.1V | 1 register, big-endian |
601 | R(VoltageA) * 10 | VoltageA | 10 | V | Voltage Phase A | 0.1V | 1 register, big-endian |
602 | R(VoltageB) * 10 | VoltageB | 10 | V | Voltage Phase B | 0.1V | 1 register, big-endian |
603 | R(VoltageC) * 10 | VoltageC | 10 | V | Voltage Phase C | 0.1V | 1 register, big-endian |
604 | R(VoltageD) * 10 | VoltageD | 10 | V | Voltage Channel D | 0.1V | 1 register, big-endian |
605 | R(VoltageE) * 10 | VoltageE | 10 | V | Voltage Channel E | 0.1V | 1 register, big-endian |
606 | R(VoltageF) * 10 | VoltageF | 10 | V | Voltage Channel F | 0.1 V | 1 register, big-endian |
651 | R(VoltageAB) * 10 | VoltageAB | 10 | V | Voltage A-B | 0.1V | 1 register, big-endian |
652 | R(VoltageCA) * 10 | VoltageCA | 10 | V | Voltage C-A | 0.1V | 1 register, big-endian |
653 | R(VoltageBC) * 10 | VoltageBC | 10 | V | Voltage B-C | 0.1V | 1 register, big-endian |
700 | R(VAR) * 1 | VAR | 1 | VA | Apparent Power Total | 1VA | 1 register, big-endian |
701 | R(VARA) * 1 | VARA | 1 | VA | Apparent Power Phase A | 1VA | 1 register, big-endian |
702 | R(VARB) * 1 | VARB | 1 | VA | Apparent Power Phase B | 1VA | 1 register, big-endian |
703 | R(VARC) * 1 | VARC | 1 | VA | Apparent Power Phase C | 1VA | 1 register, big-endian |
704 | R(VARD) * 1 | VARD | 1 | VAR | Reactive Power Channel D | 1 VAR | 1 register, big-endian |
705 | R(VARE) * 1 | VARE | 1 | VAR | Reactive Power Channel E | 1 VAR | 1 register, big-endian |
706 | R(VARF) * 1 | VARF | 10 | VAR | Reactive Power Channel F | 1 VAR | 1 register, big-endian |
801 | R(THDiA) * 10 | THDiA | 10 | THDI Phase A | 0.10% | 1 register, big-endian | |
802 | R(THDiB) * 10 | THDiB | 10 | THDI Phase B | 0.10% | 1 register, big-endian | |
803 | R(THDiC) * 10 | THDiC | 10 | THDI Phase C | 0.10% | 1 register, big-endian | |
851 | R(THDvA) * 10 | THDvA | 10 | THDV Phase A | 0.10% | 1 register, big-endian | |
852 | R(THDvB) * 10 | THDvB | 10 | THDV Phase B | 0.10% | 1 register, big-endian | |
853 | R(THDvC) * 10 | THDvC | 10 | THDV Phase C | 0.10% | 1 register, big-endian | |
900 | R(PhaseAngleA) * 10 | PhaseAngleA | 10 | Degrees | Phase Angle Phase A | 0.1 VA | 1 register, big-endian |
901 | R(PhaseAngleB) * 10 | PhaseAngleB | 10 | Degrees | Phase Angle Phase B | 0.1 VA | 1 register, big-endian |
902 | R(PhaseAngleC) * 10 | PhaseAngleC | 10 | Degrees | Phase Angle Phase C | 0.01 | 1 register, big-endian |
951 | R(PowerFactorA) * 100 | PowerFactorA | 100 | PF | Power Factor Phase A | 0.01 | 1 register, big-endian |
952 | R(PowerFactorB) * 100 | PowerFactorB | 100 | PF | Power Factor Phase B | 0.01 | 1 register, big-endian |
953 | R(PowerFactorC) * 100 | PowerFactorC | 100 | PF | Power Factor Phase C | 0.01 | 1 register, big-endian |
954 | R(PowerFactorD) * 100 | PowerFactorD | 100 | PF | Power Factor Channel D | 0.01 | 1 register, big-endian |
955 | R(PowerFactorE) * 100 | PowerFactorE | 100 | PF | Power Factor Channel E | 0.01 | 1 register, big-endian |
956 | R(PowerFactorF) * 100 | PowerFactorF | 100 | PF | Power Factor Channel F | 0.01 | 1 register, big-endian |
1000 | R(Frequency) * 10 | Frequency | 10 | Hz | Frequency (phase A) | 0.1 VA | 1 register, big-endian |
1001 | R(Temperature) * 10 | Temperature | 10 | Degrees | Temperature (internal) | 0.1°C | 1 register, big-endian |
1002 | R(VMax) * 10 | Vmax | 10 | V | Maximum Voltage | 0.1V | 1 register, big-endian |
1003 | R(IMax) * 10 | Imax | 10 | A | Maximum Current | 0.1A | 1 register, big-endian |
Environmental Monitoring and Dry Contact Registers
1200 | R(Temperature0) * 10 | Temperature0 | 10 | Degrees | Temperature (internal) | 0.1°C | 1 register, big-endian |
1201 | R(Temperature1) * 10 | Temperature1 | 10 | Degrees | Temperature Channel 1 | 0.1°C | 1 register, big-endian |
1202 | R(Temperature2) * 10 | Temperature2 | 10 | Degrees | Temperature Channel 2 | 0.1°C | 1 register, big-endian |
1203 | R(Temperature3) * 10 | Temperature3 | 10 | Degrees | Temperature Channel 3 | 0.1°C | 1 register, big-endian |
1204 | R(Temperature4) * 10 | Temperature4 | 10 | Degrees | Temperature Channel 4 | 0.1°C | 1 register, big-endian |
1205 | R(Temperature5) * 10 | Temperature5 | 10 | Degrees | Temperature Channel 5 | 0.1°C | 1 register, big-endian |
1206 | R(Temperature6) * 10 | Temperature6 | 10 | Degrees | Temperature Channel 6 | 0.1°C | 1 register, big-endian |
1207 | R(Temperature7) * 10 | Temperature7 | 10 | Degrees | Temperature Channel 7 | 0.1°C | 1 register, big-endian |
1208 | R(Temperature8) * 10 | Temperature8 | 10 | Degrees | Temperature Channel 8 | 0.1°C | 1 register, big-endian |
1209 | R(Temperature9) * 10 | Temperature9 | 10 | Degrees | Temperature Channel 9 | 0.1°C | 1 register, big-endian |
1210 | R(Temperature10) * 10 | Temperature10 | 10 | Degrees | Temperature Channel 10 | 0.1°C | 1 register, big-endian |
1211 | R(Temperature11) * 10 | Temperature11 | 10 | Degrees | Temperature Channel 11 | 0.1°C | 1 register, big-endian |
1212 | R(Temperature12) * 10 | Temperature12 | 10 | Degrees | Temperature Channel 12 | 0.1°C | 1 register, big-endian |
1250 | R(Humidity) * 10 | Humidity | 10 | % | Humidity | 0.10% | 1 register, big-endian |
1251 | R(Humidity1) * 10 | Humidity1 | 10 | % | Humidity Channel 1 | 0.10% | 1 register, big-endian |
1252 | R(Humidity2) * 10 | Humidity2 | 10 | % | Humidity Channel 2 | 0.10% | 1 register, big-endian |
1253 | R(Humidity3) * 10 | Humidity3 | 10 | % | Humidity Channel 3 | 0.10% | 1 register, big-endian |
1254 | R(Humidity4) * 10 | Humidity4 | 10 | % | Humidity Channel 4 | 0.10% | 1 register, big-endian |
1255 | R(Humidity5) * 10 | Humidity5 | 10 | % | Humidity Channel 5 | 0.10% | 1 register, big-endian |
1256 | R(Humidity6) * 10 | Humidity6 | 10 | % | Humidity Channel 6 | 0.10% | 1 register, big-endian |
1257 | R(Humidity7) * 10 | Humidity7 | 10 | % | Humidity Channel 7 | 0.10% | 1 register, big-endian |
1258 | R(Humidity8) * 10 | Humidity8 | 10 | % | Humidity Channel 8 | 0.10% | 1 register, big-endian |
1259 | R(Humidity9) * 10 | Humidity9 | 10 | % | Humidity Channel 9 | 0.10% | 1 register, big-endian |
1260 | R(Humidity10) * 10 | Humidity10 | 10 | % | Humidity Channel 10 | 0.10% | 1 register, big-endian |
1261 | R(Humidity11) * 10 | Humidity11 | 10 | % | Humidity Channel 11 | 0.10% | 1 register, big-endian |
1262 | R(Humidity12) * 10 | Humidity12 | 10 | % | Humidity Channel 12 | 0.10% | 1 register, big-endian |
1300 | R(Contact1) * 1 | Contact1 | 1 | 0/1 | Contact Status Port 1 | open / closed | 1 register, big-endian |
1301 | R(Contact2) * 1 | Contact2 | 1 | 0/1 | Contact Status Port 2 | open / closed | 1 register, big-endian |
1302 | R(Contact3) * 1 | Contact3 | 1 | 0/1 | Contact Status Port 3 | open / closed | 1 register, big-endian |
1303 | R(Contact4) * 1 | Contact4 | 1 | 0/1 | Contact Status Port 4 | open / closed | 1 register, big-endian |
1304 | R(Contact5) * 1 | Contact5 | 1 | 0/1 | Contact Status Port 5 | open / closed | 1 register, big-endian |
1305 | R(Contact6) * 1 | Contact6 | 1 | 0/1 | Contact Status Port 6 | open / closed | 1 register, big-endian |
1306 | R(Contact7) * 1 | Contact7 | 1 | 0/1 | Contact Status Port 7 | open / closed | 1 register, big-endian |
1307 | R(Contact8) * 1 | Contact8 | 1 | 0/1 | Contact Status Port 8 | open / closed | 1 register, big-endian |
1308 | R(Contact9) * 1 | Contact9 | 1 | 0/1 | Contact Status Port 9 | open / closed | 1 register, big-endian |
1309 | R(Contact10) * 1 | Contact10 | 1 | 0/1 | Contact Status Port 10 | open / closed | 1 register, big-endian |
1310 | R(Contact11) * 1 | Contact11 | 1 | 0/1 | Contact Status Port 11 | open / closed | 1 register, big-endian |
1311 | R(Contact12) * 1 | Contact12 | 1 | 0/1 | Contact Status Port 12 | open / closed | 1 register, big-endian |
1350 | R(ProbeStatus1) * 1 | ProbeStatus1 | 1 | V | Probe Status Port 1 | open / closed | 1 register, big-endian |
1351 | R(ProbeStatus2) * 1 | ProbeStatus2 | 1 | 0/1 | Probe Status Port 2 | open / closed | 1 register, big-endian |
1352 | R(ProbeStatus3) * 1 | ProbeStatus3 | 1 | 0/1 | Probe Status Port 3 | open / closed | 1 register, big-endian |
1353 | R(ProbeStatus4) * 1 | ProbeStatus4 | 1 | 0/1 | Probe Status Port 4 | open / closed | 1 register, big-endian |
1354 | R(ProbeStatus5) * 1 | ProbeStatus5 | 1 | 0/1 | Probe Status Port 5 | open / closed | 1 register, big-endian |
1355 | R(ProbeStatus6) * 1 | ProbeStatus6 | 10 | 0/1 | Probe Status Port 6 | open / closed | 1 register, big-endian |
1356 | R(ProbeStatus7) * 1 | ProbeStatus7 | 1 | 0/1 | Probe Status Port 7 | open / closed | 1 register, big-endian |
1357 | R(ProbeStatus8) * 1 | ProbeStatus8 | 10 | 0/1 | Probe Status Port 8 | open / closed | 1 register, big-endian |
1358 | R(ProbeStatus9) * 1 | ProbeStatus9 | 10 | 0/1 | Probe Status Port 9 | open / closed | 1 register, big-endian |
1359 | R(ProbeStatus10) * 1 | ProbeStatus10 | 10 | 0/1 | Probe Status Port 10 | open / closed | 1 register, big-endian |
1360 | R(ProbeStatus11) * 1 | ProbeStatus11 | 10 | 0/1 | Probe Status Port 11 | open / closed | 1 register, big-endian |
1361 | R(ProbeStatus12) * 1 | ProbeStatus12 | 10 | 0/1 | Probe Status Port 12 | open / closed | 1 register, big-endian |
1400 | R(DewPoint) * 10 | DewPoint | 10 | °C | Dew Point | 0.1°C | 1 register, big-endian |
1450 | R(Pressure) * 10000 | Pressure | 10000 | % | Differential Pressure | 0.1mBar | 1 register, big-endian |
Diagnostic Registers
2000 | R(AllReportRate) * 10 | AllReportRate | 10 | Radio Reports per Minute | 1 register, big-endian | ||
2001 | R(UniqueReportRate) * 10 | UniqueReportRate | 10 | Unique Reports Per Minute | 1 register, big-endian | ||
2010 | R(Battery) * 1 | Battery | 1 | % | Battery Percentage | 1% | 1 register, big-endian |
2011 | R(VDD) * 10 | VDD | 10 | V | Battery Voltage | 0.1V | 1 register, big-endian |
2020 | R(FirmwareImage) * 1 | FirmwareImage | 1 | Firmware Image | 1 register, big-endian | ||
2021 | R(FirmwareVersion) * 1 | FirmwareVersion | 1 | Firmware Version | 1 register, big-endian | ||
2030 | R(ICBExpected) * 1 | ICBExpected | 1 | 1 register, big-endian | |||
2031 | R(ICBImage) * 1 | ICBImage | 1 | 1 register, big-endian | |||
2032 | R(ICBReceived) * 1 | ICBReceived | 1 | 1 register, big-endian | |||
2033 | R(ICBVersion) * 1 | ICBVersion | 1 | 1 register, big-endian |
Dry Contact and Leak Detection Applications
Environmental Monitors can be used for dry contact sensing by placing a dry contact based device on an external temperature port. In the event a temperature port is open i.e. contact closure is open, it will return a temperature of -270°C. If the temperature port has a shorted or closed contact it will return a value of 300°C.
Dry Contact Status | Temp. Port Value |
Open | -270°C |
Closed | +300°C |
Using a Modbus expression “OPEN” != R(ProbeStatusx) where x= the probe port number on the monitor will return a “0” value when the port is open and a “1” value when the port is closed or shorted.
Register #(0-based) | Probe Port | Reading value expression | Value returned when dry contact open | Value returned when dry contact closed | Register mapping |
1 | 1 | “OPEN” != R(ProbeStatus1) | 0 | 1 | 1 register, big-endian |
2 | 2 | “OPEN” != R(ProbeStatus1) | 0 | 1 | 1 register, big-endian |
3 | 3 | “OPEN” != R(ProbeStatus3) | 0 | 1 | 1 register, big-endian |
4 | 4 | “OPEN” != R(ProbeStatus4) | 0 | 1 | 1 register, big-endian |
5 | 5 | “OPEN” != R(ProbeStatus5) | 0 | 1 | 1 register, big-endian |
6 | 6 | “OPEN” != R(ProbeStatus6) | 0 | 1 | 1 register, big-endian |
7 | 7 | “OPEN” != R(ProbeStatus7) | 0 | 1 | 1 register, big-endian |
8 | 8 | “OPEN” != R(ProbeStatus8) | 0 | 1 | 1 register, big-endian |
9 | 9 | “OPEN” != R(ProbeStatus9) | 0 | 1 | 1 register, big-endian |
10 | 10 | “OPEN” != R(ProbeStatus10) | 0 | 1 | 1 register, big-endian |
11 | 11 | “OPEN” != R(ProbeStatus11) | 0 | 1 | 1 register, big-endian |
12 | 12 | “OPEN” != R(ProbeStatus12) | 0 | 1 | 1 register, big-endian |
Depending on the environmental monitor used there will be 2 to 12 temperature ports available for use with dry contacts. No additional configuration is needed.
E302: Ports 1-2
E306: Ports 1-6
E312: Ports 1-12