Modbus 控制器传感器
modbus_controller 传感器平台从 modbus_controller 组件创建传感器
并要求配置 Modbus 控制器。
-
register_type(必选): Modbus 寄存器的类型。
coil:线圈是 1 位寄存器(开/关值),用于控制离散输出。它们可以被读取和/或写入。将使用 Modbus 功能代码 1(读取线圈状态)。discrete_input:离散输入寄存器(只读线圈)类似于线圈,但只能读取。将使用 Modbus 功能代码 2(读取输入状态)。holding:保持寄存器——保持寄存器是最通用的 16 位寄存器。它们可以被读取和/或写入。将使用 Modbus 功能代码 3(读取保持寄存器)。read:读取输入寄存器——寄存器是用于输入的 16 位寄存器,只能读取。将使用 Modbus 功能代码 4(读取输入寄存器)。
-
address(必选,int): 范围内第一个寄存器的起始地址(可以是十进制或十六进制)。
-
value_type(必选): Modbus 寄存器数据的数据类型。Modbus 的默认数据类型是大端格式(MSB 优先)的 16 位整数。
U_WORD:来自 1 个寄存器的无符号 16 位整数 = 16 位S_WORD:来自 1 个寄存器的有符号 16 位整数 = 16 位U_DWORD:来自 2 个寄存器的无符号 32 位整数 = 32 位S_DWORD:来自 2 个寄存器的有符号 32 位整数 = 32 位U_DWORD_R:来自 2 个寄存器的无符号 32 位整数,低字优先S_DWORD_R:来自 2 个寄存器的有符号 32 位整数,低字优先U_QWORD:来自 4 个寄存器的无符号 64 位整数 = 64 位S_QWORD:来自 4 个寄存器的有符号 64 位整数 = 64 位U_QWORD_R:来自 4 个寄存器的无符号 64 位整数,低字优先S_QWORD_R:来自 4 个寄存器的有符号 64 位整数,低字优先FP32:来自 2 个寄存器的 32 位 IEEE 754 浮点数FP32_R:32 位 IEEE 754 浮点数——与 FP32 相同,但低字优先
-
bitmask (可选,int): 有时多个值打包在一个寄存器的响应中。位掩码可用于从响应中提取值。参见位掩码。
-
skip_updates (可选,int): 默认情况下,modbus_controller 的所有传感器一起更新。对于变化不频繁的数据点,可以跳过更新。值为 5 将只在每第 6 次更新循环中更新此传感器范围。注意:modbus_controller 按地址范围对组件进行分组,以减少事务数量。具有相同起始地址的所有组件将在一次请求中更新。
skip_updates适用于同一范围中的所有组件。 -
register_count (可选,int): 此读取请求应在单个命令中跨越或跳过的连续寄存器数量。默认为 1。更多信息参见优化 Modbus 通信。
-
response_size (可选,int): 寄存器响应的字节大小。默认为 register_count*2。
-
force_new_range (可选,boolean): 如果可能,具有连续地址的传感器会被组合在一起并在一个范围内请求。设置
force_new_range: true强制在该地址处开始新范围。 -
lambda (可选,lambda): 每个更新间隔要计算的 Lambda,以获取传感器的新值。
传入 Lambda 的参数
-
x (float): Modbus 数据的解析浮点值
-
data (
std::vector<uint8_t>): 包含此传感器完整原始 Modbus 响应字节的向量 注意: 因为响应包含同一范围内所有寄存器的数据,您必须使用data[item->offset]获取传感器的第一个响应字节。 -
item (const pointer to a SensorItem derived object): 传感器对象本身。
Lambda 的可能返回值:
return <FLOATING_POINT_NUMBER>;传感器的新值。return NAN;如果状态应被视为无效以指示错误(高级)。
-
-
custom_command (可选,字节列表): Modbus 命令的原始字节。这允许使用非标准命令。如果使用
custom_command,则不能使用address和register_type。 自定义数据必须包含所有必需的字节,包括 Modbus 设备地址。CRC 会自动计算并附加到命令中。 有关如何使用custom_command的信息,参见使用custom_command -
offset (可选,int): 距起始地址的字节偏移量(仅在不常见的响应编码时必需)。如果在一个命令中写入多个寄存器,此值用于找到相对于起始地址的数据点起始位置。组件根据偏移量和值类型大小计算范围大小。对于
coil或discrete_input寄存器,偏移量是线圈/寄存器的位置,因为这些寄存器在一个字节中编码 8 个线圈。 -
来自 Sensor 的其他所有选项。
以下示例将发送 2 个 Modbus 命令(假定设备地址为 1):
0x1 0x4 0x31 0x0 0x0 0x02 x7f 0x37(从 0x3100 开始读取 2 个寄存器)
0x1 0x3 0x90 0x1 0x0 0x1 0xf8 0xca(从 0x9001 读取 1 个保持寄存器)
- platform: modbus_controller modbus_controller_id: modbus1 id: pv_input_voltage name: "PV array input voltage" address: 0x3100 unit_of_measurement: "V" ## for any other unit the value is returned in minutes register_type: read value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.01
- platform: modbus_controller modbus_controller_id: modbus1 name: "Battery Capacity" id: battery_capacity register_type: holding address: 0x9001 unit_of_measurement: "AH" value_type: U_WORDmodbus 传感器平台允许您使用在数据发布之前调用的 Lambda,通过
Lambdas。
以下示例记录了解析后的值和为此寄存器范围接收的原始 Modbus 字节:
# 示例配置条目sensor: - platform: modbus_controller modbus_controller_id: modbus1 id: battery_capacity address: 0x9001 name: "Battery Capacity" register_type: holding value_type: U_WORD lambda: |- ESP_LOGI("","Lambda incoming value=%f - data array size is %d",x,data.size()); ESP_LOGI("","Sensor properties: adress = 0x%X, offset = 0x%X value type=%d",item->start_address,item->offset,item->sensor_value_type); int i=0 ; for (auto val : data) { ESP_LOGI("","data[%d]=0x%02X (%d)",i,data[i],data[i]); i++; } return x ;