# Modbus TCP Communication Interface

# Introduction

Refer to the Refernce section for details of the Modbus protocol.

This document describes public Modbus TCP implementation for Enapter Electrolyser EL 2.1 and assume understanding of TCP/IP and Modbus protocols.

# Physical Interface Connection

Connect Ethernet cable to the Ethernet Port of Enapter EL 2.1 electrolyser.

# TCP/IP Connection Settings

By default DHCP client is enabled therefore IP address will be assigned autmatically by DHCP server available in the connected network.

It is recommended to set DHCP reservation based on MAC address of the electrolyser.

Configuration of the Static IP is possible using Enpater Cloud and Enapter Mobile Application for iOS and Android.

# Modbus Connection Settings

Option Value Comment
Modbus Port 502
Modbus Slave Address 1 Enapter Electrolyser always addressed as a slave

# References


# Data Formats Used

Primary tables Object Type Permission Comment
Input Registers 16 bit word Read Only
Holding Registers 16 bit word Read / Write

# Data Bits/Registers Dimension

Data Type Size in Bits Registers Used Comment
Boolean 16 bits 1 register 0 value means 'false', all other cases - 'true'
Uint16 16 bits 1 register
Uint32 32 bits 2 registers
Uint64 64 bits 4 registers
Float32 32 bits:
* bit 31: Sign (1 bit)
* bit 30-23: Exponent (8 bits)
* bit 22-0: Fraction (23 bits)
2 registers IEEE 754 Single-precision loating-point

# Data Encoding

Big endian, high word first data encoding used.

This means that when more than single byte (8 bits) is transmitted, network byte order is used - the most significant byte placed at lower address (sent first).

# Implemented Modbus Functions

Function Code Comment
Read Holding Registers 03
Read Input Registers 04
Write Single Holding Register 06
Write Multiple Holding Registers 16

# Modbus Data Model

Input registers and Holding registers are referred to in the range 3XXXX and 4XXXX respectful (also known as PLC Address). For example, Holding register 0 in this document would be referred to as 40001 and would be addressed as register 0000 in the data address field of the Modbus message (also known as Protocol Address).

# Events

# Severity Levels

Code Severity Level LED Indication Description Comment
F Fatal Error Red and Yellow Blinks System stopped. Unrecoverable error. Hardware repair required. e.g. Pressure sensor is not connected or broken.
E Error Red Blinks System Stopped. Recoverable error. e.g. No input water pressure and internal water tank is empty.
W Warning Yellow Blinks Heads-up event which should be taken into account to avoid Error or Fatal Error. e.g. No input water pressure and internal water tank is full.

# Routines

Code Routine Comment
C Electrolyte Circulation
D Stack Ramp Down
R Water Refilling
S Steady Hydrogen Production
T Temperature Management
U Stack Ramp Up
X Safety Check
F Anti-freezing
L Leakege Test
O Blowdown
P Platform

# Error Codes

0x0000 none -- No error
0x0FFF int -- Unexcepted error, hardware failure, read logs for details
0x1F81 FP_01 -- Brownout detected, restore power and reset system
0x108A FC_10 P107 Pump broken
0x128A FT_10 TT106 Too high electrolyte temperature (> 58 °C)
0x2EAC WT_20 F103A Electrolyte cooling fan broken
0x228A ET_10 TT102A Too low electrolyte temperature (< 6 °C)
0x2F22 WU_10 PT101A Gas side pressure isn't atmospheric. Ramp-Up isn't possible (pressure too high for start)
0x2E2C WS_20 PT101C Max pressure state
0x2E2D WS_21 PT101A Drifting PT101A
0x119E FR_30 PT105 Too high water inlet pressure
0x2DA2 WR_10 PT105 Too high water inlet pressure
0x2DAC WR_20 PT105 Too low water inlet pressure
0x118A FR_10 LSHH102A Too much high electrolyte level
0x1194 FR_20 LSL102D Too much low electrolyte level
0x11B2 FR_50 LSL102D
Water sensor conflict low-medium
0x11B3 FR_51 LSM102C
Water sensor conflict medium-high
0x11B4 FR_52 LSH102B
Water sensor conflict high-very_high
0x11A8 FR_40 -- Check water leaks
0x2DAD WR_21 -- Refilling timeout
0x2DCB WR_51 LSL102D Drain completely
0x2DCC WR_52 LSL102D Refill to low level
0x1114 FD_20 PT101A Hydrogen leaks
0x148A FF_10 -- Frozen pipes
0x1401 FX_01 PT101A High hydrogen inner pressure
0x1402 FX_02 WPS104 Water presence
0x1403 FX_03 PSU 48V Broken PSU
0x1404 FX_04 HASS High stack current
0x1405 FX_05 TSH106 High backflow temperature
0x1406 FX_06 PT101A Hydrogen leaks
0x1407 FX_07 TS108 High electronic board temperature
0x1408 FX_08 PSH102 High electrolyte tank pressure
0x1409 FX_09 TSLL102B Low electrolyte temperature
0x140A FX_10 PSHH102B High hydrogen pressure
0x141E FX_30 PT105 Water inlet pressure transmitter broken
0x141F FX_31 TT102A Electrolyte tank temperature transmitter broken
0x1420 FX_32 FM106 Electrolyte flow meter broken
0x1421 FX_33 TT106 Electrolyte backflow temperature transmitter broken
0x1422 FX_34 PT101A Hydrogen inner pressure transmitter broken
0x1423 FX_35 PT101C Outer hydrogen pressure transmitter broken
0x1424 FX_36 F1084B Chassis circulation fan broken
0x1425 FX_37 F108C Electronic compartment cooling fan broken
0x1426 FX_38 TS108 Electronic board temperature transmitter broken
0x1427 FX_39 HASS Current sensor broken
0x1428 FX_40 External switch Dry contact error
0x1501 FL_01 -- Huge H2 leak detected
0x358A WO_10 PT101C Outer pressure is too high to run blowdown routine
0x3594 WO_20 -- The Blowdown procedure will be started at H2-production start
0x159E FO_30 PT101C The purge line is obstructed OR that the adjustable check valve (CV101B) cracking pressure is set incorrectly

# Modbus Table

# Holding Registers (Read / Write)

Register Data Type Name Comment
0 Uint64 Unix Time Seconds from 1 January 1970 UTC.
e.g. 02/29/2020 @ 3:15pm (UTC) represented as 1582989315.
4 Boolean Reboot 1 = Reboot.
5 Boolean Locate Electrolyser 1 = Start Blinking All LED; 0 = Stop Blinking All LED.
6 Boolean Maintenance Mode 1 = Enable Maintenance Mode; 0 = Disable Maintenanace Mode.
1000 Boolean Start / Stop Electrolyser 1 = Start; 0 = Stop.
1002 Float32 Production Rate [%] Current production rate in precent (system reset set this value to 'Default Production Rate'), can be changed 'on-fly' even when electrolyser produce H2
1010 Boolean Request Blowdown routine 1 = Request blowdown or read 'is blowdown requested'
4000 Boolean Configuration Begin 1 = Start configuration
4001 Boolean Configuration Commit 1 = Commit current changes; 0 = Rollback changes
4020 Uint32 Ethernet IP Address e.g. 0xC0A80201 (
4022 Uint32 Ethernet IP Netmask
4024 Uint32 Ethernet Gateway IP Address
4308 Float32 Max Tank Pressure (Outlet) bar
4310 Float32 Restart Pressure (Outlet) bar
4396 Float32 Default Production Rate [%] This register can be modified only when stack is inactive (Idle or Maintenance mode)

# Input Registers (Read Only)

Register Data Type Name Comment
0 Uint32 Device Model 0x454C3231 ("EL21")
2 Uint16 Firmware MAJOR and MINOR Version e.g. 0x0100 (1.0)
3 Uint16 Firmware PATCH Version e.g. 0x0011 (17)
4 Uint32 Firmware Build Number e.g. 0x4E343471
6 Uint128 Device Control Board Serial Number 9E25E695-A66A-61DD-6570-50DB4E73652D
14 Uint64 Cabinet (Chassis) Serial Number 19030125124810
18 Uint16 System State 0 = Internal Error, System not Initialized yet; 1 = System in Operation; 2 = System in Maintenance Mode; 3 = System Halted (e.g. during error); 4 = Fatal Error.
20 Uint32 Live time [seconds] Total time during which a system is power up (not only time when stack is working).
22 Uint32 Uptime [seconds] How long the system has been running
768 Array of 32 Warning Events Warning Events Array Warning Events Array represented by Error Codes. First Uint16 contains total quantity of Warning Events.
832 Array of 32 Error Events Error Events Aray Error Events Array represented by Error Codes. First Uint16 contains total quantity of Error Events.
1000 Uint32 Stack Serial Number
1002 Uint32 Stack Start/Stop Cycles Quantity
1004 Uint32 Stack Total Runtime seconds
1006 Float32 Stack Total H2 Production NL
1008 Float32 H2 Flow Rate NL/hour, NAN when not producing H2;
4000 Boolean Configuration Progress 1 = Configuration is in progress.
4001 Boolean Configuration Source 1 = Configuration over Modbus.
4002 Int32 Last Configuration Result 0 = OK, Configuration was completed successfully; 1 = Permanent, The operation has failed (internal or general error); 2 = No Entry, Configuration was not started or interrupted; 5 = I/O, Data save error; 11 - Try again, Configuration needs to be tried again; 13 = Access Denied, Some changed registers are read-only; 16 = Busy, Another configuration was in progress; 22 = Invalid, The data has invalid or wrong type.
4004 Uint16 Last Configuration Wrong Holding Keeps first invalid Holding register number which doesn't allow successfull configuration commit.
7002 Boolean High Electrolyte Level Switch (LSH102B_in) 1 = Electrolyte level over sensor; 0 = Electrolyte level below sensor.
7003 Boolean Very High Electrolyte Level Switch (LSHH102A_in) 1 = Electrolyte level over sensor; 0 = Electrolyte level below sensor.
7004 Boolean Low Electrolyte Level Switch (LSL102D_in) 1 = Electrolyte level over sensor; 0 = Electrolyte level below sensor.
7005 Boolean Medium Electrolyte Level Switch (LSM102C_in) 1 = Electrolyte level over sensor; 0 = Electrolyte level below sensor.
7006 Boolean Electrolyte Tank High Pressure Switch (PSH102_in) 1 = Pressure is too high; 0 = Pressure is normal.
7007 Boolean Very High Hydrogen Pressure Switch (PSHH101B_in) 1 = Pressure is too high; 0 = Pressure is normal.
7008 Boolean Downstream High Temperature Switch (TSH106_in) 1 = Temperature is too high. 0 = Temperature is normal.
7009 Boolean Electronic Compartment High Temperature Switch (TSH108_in) 1 = Temperature is too high. 0 = Temperature is normal.
7010 Boolean Very Low Electrolyte Temperature Switch (TSLL102B_in) 1 = Temperature is too low. 0 = Temperature is normal.
7011 Boolean Chassis Water Presence Switch (WPS104_in) 1 = Water is present on input; 0 = No water input.
7500 Float32 Electrolyte Cooler Fan Speed (F103A_in_rpm) [rpm]
7502 Float32 Air Circulation Fan Speed (F104B_in_rpm) [rpm]
7504 Float32 Electronic Compartment Cooling Fan Speed (F108C_in_rpm) [rpm]
7506 Float32 Electrolyte Flow Meter (FM106_in_lmin) [Liters per minute]
7508 Float32 Stack Current (HASS_in_a) [Ampere]
7510 Float32 PSU Voltage Signal (PSU_in_v) [Volt]
7512 Float32 Inner Hydrogen Pressure (PT101A_in_bar) [bar]
7514 Float32 Outer Hydrogen Pressure (PT101C_in_bar) [bar]
7516 Float32 Water Inlet Pressure (PT105_in_bar) [bar]
7518 Float32 Electrolyte Temperature (TT102A_in_c) [°C]
7520 Float32 Downstream Temperature (TT106_in_c) [°C]
8000 Float32 Inner Hydrogen Pressure Raw Sensor Value (PT101A_in_v) Raw value, [Volt]
8002 Float32 Outer Hydrogen Pressure Raw Sensor Value (PT101C_in_v) Raw value, [Volt]
8004 Float32 Stack Current Raw Sensor Value (HASS_in_v) Raw value, [Volt]

# Example: Configuration Sequence

Here is an example to change Electrolyser Restart Pressure to 25 bar. This will enable Electrolyser to restart when pressure drop to 25 bar on outlet.