This page explains how to integrate the PSA nitrogen generator with a PLC, SCADA system, or BMS using Modbus TCP.
1) What protocol does the generator use?
- Protocol: Modbus TCP/IP
- Port: 502
- Device role: Slave
- Physical layer: Ethernet (static IP required)
2) What do I need from the customer/network?
- Generator PLC static IP address
- Same VLAN/subnet routing to the SCADA/PLC (or proper routing in place)
- TCP port 502 allowed between client and generator PLC
3) Addressing and data format (read this first)
Addressing mode varies by software. The manual lists registers as “4xxxx” (holding registers) and coils as “0xxxx”. Many clients want a zero-based offset instead.
| Manual Address | If your driver uses offsets | Example |
|---|---|---|
| Holding register 40006 | Offset 5 | 40006 → 5 |
| Holding register 40119 | Offset 118 | 40119 → 118 |
| Coil 00013 | Offset 12 | 00013 → 12 |
Data types:
- 16-bit holding registers: start with Unsigned/Int16. If the value looks scaled (e.g., 2150 instead of 21.50), apply scaling (e.g., multiply by 0.01). This depends on the client’s implementation and how they represent decimals.
- 32-bit holding registers (run hours): use a 32-bit integer type (DINT/UDINT). If the number is incorrect, swap word order (endianness) in your driver.
4) Register Map (per manual)
Holding Registers (16-bit)
| Tag / Point | Unitronics | Modbus Address | Units | Access |
|---|---|---|---|---|
| Nitrogen Storage Pressure | MI 118 | 40119 | PSIG / kPa | R |
| Oxygen Concentration (%) | MI 5 | 40006 | % O2 | R |
| Oxygen Concentration (PPM) | MI 112 | 40113 | PPM | R |
| Supply Air Pressure | MI 161 | 40162 | PSIG / kPa | R |
| Supply Air Flow | MI 155 | 40156 | SCFM / SCMH | R |
| Nitrogen Flow | MI 167 | 40168 | SCFH / SLPM | R |
| Supply Air Temperature | MI 173 | 40174 | °F / °C | R |
| Supply Air Pressure Dewpoint | MI 255 | 40256 | °F / °C | R |
| N2 Generator Cut-In Pressure | MI 20 | 40021 | PSIG / kPa | R/W |
| N2 Generator Cut-Out Pressure | MI 21 | 40022 | PSIG / kPa | R/W |
| Low Tank Pressure Alarm Point | MI 98 | 40099 | PSIG / kPa | R/W |
| O2% Alarm Point | MI 14 | 40015 | % O2 | R/W |
| O2 PPM Alarm Point | MI 16 | 40017 | PPM | R/W |
| Duplex Switch-Over Hours Setpoint | MI 239 | 40240 | Hours | R |
| Duplex Current Run Hours | MI 242 | 40243 | Hours | R |
Holding Registers (32-bit)
| Tag / Point | Unitronics | Modbus Address | Units | Access |
|---|---|---|---|---|
| Staging Current Run Hours | ML 36 | 28709 | Hours | R |
| Staging Switch-Over Hours Setpoint | ML 37 | 28710 | Hours | R |
| Generator Total Run Hours | ML 14 | 28687 | Hours | R |
Coils (Discrete)
| Tag / Point | Unitronics | Modbus Address | States | Access |
|---|---|---|---|---|
| Start / Stop | MB 12 | 00013 | 0=Off, 1=On | R/W |
| Running / Standby | MB 7 | 00008 | 0=Standby, 1=Running | R |
| Common Alarm | MB 61 | 00062 | 0=Good, 1=Alarm | R |
| Common Alarm Toggle | MB 19 | 00020 | 0=Off, 1=On | R/W |
| BlastOff Alarm | MB 2050 | 02051 | 0=Good, 1=Alarm | R |
| Oxygen Concentration Alarm | MB 0 | 00001 | 0=Good, 1=Alarm | R |
| PurityProtect On/Off | MB 225 | 00226 | 0=Off, 1=On | R/W |
| Low Tank Pressure Alarm | MB 106 | 00107 | 0=Good, 1=Alarm | R |
| Particulate Filter Status | MB 14 | 00015 | 0=Good, 1=Change Needed | R |
| Coalescing Filter Status | MB 28 | 00029 | 0=Good, 1=Change Needed | R |
| Absorbing Filter Status | MB 29 | 00030 | 0=Good, 1=Change Needed | R |
| Local Alarm Buzzer Toggle | MB 227 | 00228 | 0=Off, 1=On | R/W |
| PSA Staging Toggle | MB 170 | 00171 | 0=Off, 1=On | R/W |
| PSA Duplex Toggle | MB 208 | 00209 | 0=Off, 1=On | R/W |
| Duplex - Set Primary | MB 211 | 00212 | Set primary on start-up | R/W |
| Duplex Identification | MB 210 | 00211 | 0=Secondary, 1=Primary | R |
5) Copy/Paste Tag Examples
A) Ignition (Modbus TCP driver) – example tag set
Device: N2_GEN_PLC (IP = generator static IP, Port = 502)
Create tags like:
N2_Generator/N2_Storage_Pressure Data Type: Int2 (or UInt2) Register Type: Holding Register Address: 40119 (or Offset: 118) N2_Generator/O2_Percent Data Type: Int2 (or UInt2) Register Type: Holding Register Address: 40006 (or Offset: 5) N2_Generator/Start_Stop_Command Data Type: Boolean Register Type: Coil Address: 00013 (or Offset: 12)
Scaling tip: If O2% reads 2150 but the HMI shows 21.50, apply a scale factor of 0.01 in the tag.
B) Kepware (Modbus TCP/IP Ethernet) – example items
Channel: Modbus TCP/IP Ethernet
Device: GeneratorPLC (IP = generator static IP, Port = 502, Unit ID typically 1)
O2_Percent Address: 40006 (Holding Register) Data Type: 16-bit Integer (try Unsigned first) N2_Storage_Pressure Address: 40119 (Holding Register) Data Type: 16-bit Integer Generator_Total_Run_Hours Address: 28687 (Holding Register, 32-bit) Data Type: 32-bit Integer (swap words if incorrect) Start_Stop Address: 00013 (Coil) Data Type: Boolean
C) Allen-Bradley (Logix) – mapping approach (generic)
Most AB integrations use a gateway/driver (Kepware/ProSoft/Red Lion/Ignition) rather than native Modbus TCP on the CPU. The simplest approach is:
- Use Kepware/SCADA as the Modbus client.
- Expose resulting points to Logix via OPC UA/EtherNet/IP produced tags.
6) Troubleshooting Flowchart
Start | v Ping generator IP? |-- NO -- Check Ethernet link/switch/VLAN, IP/subnet, static IP config -- Retry | YES | v Connect to TCP port 502? |-- NO -- Firewall/ACL, port blocked, wrong IP, controller not on network -- Retry | YES | v Values plausible? |-- NO -- Check addressing mode (4xxxx vs offset), subtract-1 offset, | 16/32-bit data type, word order (32-bit) -- Retry | YES | v Write Start/Stop (coil 00013)? |-- NO -- Verify write permissions, correct coil address/offset, interlocks/local mode -- Retry | YES -- Integration OK
7) Download: Modbus Integration PDF
If you need South-Tek assistance, provide a screenshot of your driver’s addressing mode settings and one example tag/item configuration.