MODBUS RTU-RS485 ISSUE Temperature and Humidity, cannot read both at same time

425 views Asked by At

I have a Temperature and Humidity Sensor (R444A01) connected to a LogicMachine (LM5LP2) via MODBUS RTU (RS485 port).

Sensor R444A01 Datasheet (Please bear in mind we are talking about a non-expensive device, poorly documented and with no support, aside from some User Reviews and Vendor Specifications)

This is my (very simple) code:

{
  "manufacturer": "Embedded Systems",
  "description": "Sensor R444A01",
  "mapping": [
    {
      "name": "Temperature",
      "bus_datatype": "float16",
      "datatype": "int16",
      "type": "register",
      "address": 0,
      "value_multiplier": 0.1,
      "units": "C"
    },
    {
      "name": "Humidity",
      "bus_datatype": "float16",
      "datatype": "uint16",
      "type": "register",
      "address": 1,
      "value_multiplier": 0.1,
      "units": "%"
    }
  ]
} 

The issue that I'm facing is that, when mapping these 2 addresses to a KNX address, if I only map 1 address, then I can read it, but if I map both of them, then I can only read "Temperature" (which happens to be the first address in my code). Here's a picture of what I see: KNX address mapping for MODBUS addresses

Apparently, for Humidity value, the LogicMachine reads the lowest possible number an int16 can give (32768), even though the received data should be uint16 datatype as it's Humidity (a percentage value) that we are talking about.

Finally, here is what the Modbus Poll Log says (suggesting that I should be able to read both the Temperature and Humidity values):


[18/05/2021 21:51:32] Modbus Request (COM10)

Address: 1 Function: 3 (0x03) - Read Holding Registers Starting Address: 0 Quantity: 2

Checksum: 50187(OK)


[18/05/2021 21:51:32] Modbus Response (COM10)

Address: 1 Function: 3 (0x03) - Read Holding Registers

Byte Count: 4
Values: 00 f3 01 ea 
    Register0: 243
    Register1: 490

Checksum: 35359(OK)


Don't know if anybody has any idea why this could be happening, but I appreciate any responses.

Thank you very much.

1

There are 1 answers

0
David On BEST ANSWER

As @Marcos G. pointed out in the question's comments, it turns out that the only way to succesfully ask the Sensor R444A01 about the values of multiple registers is to read these registers on a single query, instead of 1 query per 1 register.

Therefore, I needed to make use of the following keys: "read_count" and "read_offset".

Here is the correct code in order to read both Temperature and Humidity values on a single query:

{
  "manufacturer": "Embedded Systems",
  "description": "Sensor R444A01",
  "mapping": [
    {
      "name": "Temperature",
      "bus_datatype": "float16",
      "type": "register",
      "address": 0,
      "read_offset": 0,
      "read_count": 2,
      "value_multiplier": 0.1,
      "units": "ºC"
    },
    {
      "name": "Humidity",
      "bus_datatype": "float16",
      "type": "register",
      "address": 0,
      "read_offset": 1,
      "read_count": 2,
      "value_multiplier": 0.1,
      "units": "%"
    }
  ]
}