Modbus Binding update only first item

In my setup i have to read different input register from an SDM120 Modbus power monitor. I have it connected via ad RS232 to TCP converter.

This is the documentation of the protocol: http://www.eastroneurope.com/media/_system/tech_specs/3914/SDM120%20PROTOCOL.pdf

This is my modbus.things

Bridge modbus:tcp:TCPContatore [ host="192.168.2.98", port=502, id=1 ] {
 Bridge poller inputRegisters [ start=0, length=2, refresh=1000, type="input" ] {
 Thing data voltage [ readStart="0", readValueType="float32" ]
 Thing data current [ readStart="6", readValueType="float32" ]
 Thing data activepower [ readStart="12", readValueType="float32" ]
 Thing data frequency [ readStart="70", readValueType="float32" ]
 Thing data importactiveenergy [ readStart="72", readValueType="float32" ]
 }
}

This is my modbus.items:

    Group energy_items
    Number contatore_voltaggio "Voltaggio [%.1f V]" (energy_items) { channel="modbus:data:TCPContatore:inputRegisters:voltage:number" }
    Number contatore_current "Corrente [%.1f A]" (energy_items) { channel="modbus:data:TCPContatore:inputRegisters:current:number" }
    Number contatore_frequency "Frequenza [%.1f Hz]" (energy_items) { channel="modbus:data:TCPContatore:inputRegisters:frequency:number" }
    Number contatore_activepower "Potenza [%.1f W]" (energy_items) { channel="modbus:data:TCPContatore:inputRegisters:activepower:number" }
    Number contatore_importactiveenergy "Consumi [%.1f kWh]" (energy_items) { channel="modbus:data:TCPContatore:inputRegisters:importactiveenergy:number" }

Only the first item (contatore_voltaggio) is being updated. I also looked at the log in Trace mode, only calls for updating contatore_voltaggio are being made.

This is a section of the log:

21:13:13.542 [DEBUG] [.handler.ModbusPollerThingHandlerImpl] - Thing modbus:poller:TCPContatore:inputRegisters received registers RegisterArrayWrappingInputRegister(43 66 99 9a) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:13.545 [TRACE] [ternal.handler.ModbusDataThingHandler] - Channel number will be updated to '230.60000610351562' (type DecimalType). Input data: number value 230.60000610351562 (value type 'float32' taken into account) and bool value true. Transformation: <identity>
21:13:13.551 [INFO ] [smarthome.event.ItemStateChangedEvent] - contatore_voltaggio changed from 230.1999969482422 to 230.60000610351562
21:13:13.552 [DEBUG] [ternal.handler.ModbusDataThingHandler] - Thing modbus:data:TCPContatore:inputRegisters:voltage channels updated: {modbus:data:TCPContatore:inputRegisters:voltage:number=230.60000610351562}. readValueType=float32, readIndex=Optional[0], readSubIndex(or 0)=0, extractIndex=0 -> numeric value 230.60000610351562 and boolValue=true. Registers RegisterArrayWrappingInputRegister(43 66 99 9a) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:14.831 [DEBUG] [.handler.ModbusPollerThingHandlerImpl] - Thing modbus:poller:TCPContatore:inputRegisters received registers RegisterArrayWrappingInputRegister(43 67 00 00) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:14.833 [TRACE] [ternal.handler.ModbusDataThingHandler] - Channel number will be updated to '231.0' (type DecimalType). Input data: number value 231.0 (value type 'float32' taken into account) and bool value true. Transformation: <identity>
21:13:14.838 [DEBUG] [ternal.handler.ModbusDataThingHandler] - Thing modbus:data:TCPContatore:inputRegisters:voltage channels updated: {modbus:data:TCPContatore:inputRegisters:voltage:number=231.0}. readValueType=float32, readIndex=Optional[0], readSubIndex(or 0)=0, extractIndex=0 -> numeric value 231.0 and boolValue=true. Registers RegisterArrayWrappingInputRegister(43 67 00 00) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:14.842 [INFO ] [smarthome.event.ItemStateChangedEvent] - contatore_voltaggio changed from 230.60000610351562 to 231.0
21:13:16.067 [DEBUG] [.handler.ModbusPollerThingHandlerImpl] - Thing modbus:poller:TCPContatore:inputRegisters received registers RegisterArrayWrappingInputRegister(43 66 b3 33) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:16.069 [TRACE] [ternal.handler.ModbusDataThingHandler] - Channel number will be updated to '230.6999969482422' (type DecimalType). Input data: number value 230.6999969482422 (value type 'float32' taken into account) and bool value true. Transformation: <identity>
21:13:16.074 [DEBUG] [ternal.handler.ModbusDataThingHandler] - Thing modbus:data:TCPContatore:inputRegisters:voltage channels updated: {modbus:data:TCPContatore:inputRegisters:voltage:number=230.6999969482422}. readValueType=float32, readIndex=Optional[0], readSubIndex(or 0)=0, extractIndex=0 -> numeric value 230.6999969482422 and boolValue=true. Registers RegisterArrayWrappingInputRegister(43 66 b3 33) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:16.077 [INFO ] [smarthome.event.ItemStateChangedEvent] - contatore_voltaggio changed from 231.0 to 230.6999969482422
21:13:16.275 [INFO ] [smarthome.event.ItemStateChangedEvent] - solar_voltage changed from 132.6697540283203 to 132.00257873535156
21:13:16.315 [INFO ] [smarthome.event.ItemStateChangedEvent] - cucina_hum changed from 42.40 to 42.50
21:13:16.637 [INFO ] [smarthome.event.ItemStateChangedEvent] - solar_current changed from 0.02094560069963336 to 0.021751200780272484
21:13:17.306 [DEBUG] [.handler.ModbusPollerThingHandlerImpl] - Thing modbus:poller:TCPContatore:inputRegisters received registers RegisterArrayWrappingInputRegister(43 66 66 66) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:17.309 [TRACE] [ternal.handler.ModbusDataThingHandler] - Channel number will be updated to '230.39999389648438' (type DecimalType). Input data: number value 230.39999389648438 (value type 'float32' taken into account) and bool value true. Transformation: <identity>
21:13:17.319 [INFO ] [smarthome.event.ItemStateChangedEvent] - contatore_voltaggio changed from 230.6999969482422 to 230.39999389648438
21:13:17.324 [DEBUG] [ternal.handler.ModbusDataThingHandler] - Thing modbus:data:TCPContatore:inputRegisters:voltage channels updated: {modbus:data:TCPContatore:inputRegisters:voltage:number=230.39999389648438}. readValueType=float32, readIndex=Optional[0], readSubIndex(or 0)=0, extractIndex=0 -> numeric value 230.39999389648438 and boolValue=true. Registers RegisterArrayWrappingInputRegister(43 66 66 66) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:18.001 [INFO ] [smarthome.event.ItemStateChangedEvent] - sala_hum changed from 46.50 to 46.60
21:13:18.550 [DEBUG] [.handler.ModbusPollerThingHandlerImpl] - Thing modbus:poller:TCPContatore:inputRegisters received registers RegisterArrayWrappingInputRegister(43 67 00 00) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:18.552 [TRACE] [ternal.handler.ModbusDataThingHandler] - Channel number will be updated to '231.0' (type DecimalType). Input data: number value 231.0 (value type 'float32' taken into account) and bool value true. Transformation: <identity>
21:13:18.554 [DEBUG] [ternal.handler.ModbusDataThingHandler] - Thing modbus:data:TCPContatore:inputRegisters:voltage channels updated: {modbus:data:TCPContatore:inputRegisters:voltage:number=231.0}. readValueType=float32, readIndex=Optional[0], readSubIndex(or 0)=0, extractIndex=0 -> numeric value 231.0 and boolValue=true. Registers RegisterArrayWrappingInputRegister(43 67 00 00) for request ModbusPollerThingHandlerImpl.ModbusPollerReadRequest@35fbab6[slaveId=1,functionCode=READ_INPUT_REGISTERS,start=0,length=2,maxTries=3]
21:13:18.558 [INFO ] [smarthome.event.ItemStateChangedEvent] - contatore_voltaggio changed from 230.39999389648438 to 231.0

I’m new to modbus, but i don’t see anything wrong. Can you help me?

This polls a total of two standard modbus 16-bit registers, starting at address 0

The first data thing belonging to this poller interprets two standard registers as a 32-bit floating point, and assigns them to a channel called voltage.

The second data thing isn’t going to do anything; because there is no address 6 in this poller, Poller is only fetching two starting at address 0, because that is what you asked for, so that would be 0 and 1, which are both being used already for channel voltage

You need to adjust the length in your poller so that it fetches more registers.
The length there is always counted in standard (16-bit) registers. I think you’d need 74

Ahh i see, thank you very much! Solved!

A caution, having seen addresses in your docs in the 300 area ; do not set length above 120 or so. This is a limitation of Modbus protocol which uses max 256 byte packets. (about 120 16-bitregisters + overheads)

You can set up several pollers to different address ranges. Make sure each has a unique name.