MODBUS RTU-RS485 ISSUE 温度和湿度,不能同时读取
MODBUS RTU-RS485 ISSUE Temperature and Humidity, cannot read both at same time
我有一个温度和湿度传感器 (R444A01) 通过 MODBUS RTU(RS485 端口)连接到 LogicMachine (LM5LP2)。
Sensor R444A01 Datasheet(请记住,我们谈论的是一种不昂贵的设备,除了一些用户评论和供应商规范外,没有任何文档支持)
这是我的(非常简单的)代码:
{
"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": "%"
}
]
}
我面临的问题是,当将这 2 个地址映射到 KNX 地址时,如果我只映射 1 个地址,那么我可以读取它,但是如果我映射了它们两个,然后我只能读取“温度”(恰好是我代码中的第一个地址)。这是我看到的图片:
KNX address mapping for MODBUS addresses
显然,对于湿度值,LogicMachine 读取 int16
可以给出的最低可能数字 (32768),即使接收到的数据应该是 uint16
数据类型,因为它是湿度(百分比值) 我们正在谈论的。
最后,这是 Modbus 轮询日志所说的内容(建议我应该能够读取温度和湿度值):
[18/05/2021 21:51:32]
Modbus 请求 (COM10)
地址:1
功能:3 (0x03) - 读取保持寄存器
起始地址:0
数量:2
校验和:50187(正常)
[18/05/2021 21:51:32]
Modbus 响应 (COM10)
地址:1
功能:3 (0x03) - 读取保持寄存器
Byte Count: 4
Values: 00 f3 01 ea
Register0: 243
Register1: 490
校验和:35359(正常)
不知道是否有人知道为什么会发生这种情况,但我很感激任何回复。
非常感谢。
正如@Marcos G. 在问题的评论中指出的那样,事实证明,成功向传感器 R444A01 询问多个寄存器的值的唯一方法是在单个查询中读取这些寄存器,而不是 1 个查询每 1 个寄存器。
因此,我需要使用以下键:“read_count”和“read_offset”。
这是正确的代码,以便在单个查询中读取温度和湿度值:
{
"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": "%"
}
]
}
我有一个温度和湿度传感器 (R444A01) 通过 MODBUS RTU(RS485 端口)连接到 LogicMachine (LM5LP2)。
Sensor R444A01 Datasheet(请记住,我们谈论的是一种不昂贵的设备,除了一些用户评论和供应商规范外,没有任何文档支持)
这是我的(非常简单的)代码:
{
"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": "%"
}
]
}
我面临的问题是,当将这 2 个地址映射到 KNX 地址时,如果我只映射 1 个地址,那么我可以读取它,但是如果我映射了它们两个,然后我只能读取“温度”(恰好是我代码中的第一个地址)。这是我看到的图片: KNX address mapping for MODBUS addresses
显然,对于湿度值,LogicMachine 读取 int16
可以给出的最低可能数字 (32768),即使接收到的数据应该是 uint16
数据类型,因为它是湿度(百分比值) 我们正在谈论的。
最后,这是 Modbus 轮询日志所说的内容(建议我应该能够读取温度和湿度值):
[18/05/2021 21:51:32] Modbus 请求 (COM10)
地址:1 功能:3 (0x03) - 读取保持寄存器 起始地址:0 数量:2
校验和:50187(正常)
[18/05/2021 21:51:32] Modbus 响应 (COM10)
地址:1 功能:3 (0x03) - 读取保持寄存器
Byte Count: 4
Values: 00 f3 01 ea
Register0: 243
Register1: 490
校验和:35359(正常)
不知道是否有人知道为什么会发生这种情况,但我很感激任何回复。
非常感谢。
正如@Marcos G. 在问题的评论中指出的那样,事实证明,成功向传感器 R444A01 询问多个寄存器的值的唯一方法是在单个查询中读取这些寄存器,而不是 1 个查询每 1 个寄存器。
因此,我需要使用以下键:“read_count”和“read_offset”。
这是正确的代码,以便在单个查询中读取温度和湿度值:
{
"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": "%"
}
]
}