跳转到内容

Modbus 控制器选择器

modbus_controller 选择器平台允许您从 modbus 寄存器创建选择器。

  • address (必填, int):选择器的第一个或唯一寄存器的起始地址(可以是十进制或十六进制)。

  • optionsmap (必填, Map[str, int]):提供从此选择器的选项(str)到 modbus 寄存器的值(int)的映射,反之亦然。所有选项和所有值必须唯一。

  • value_type (可选):modbus 数据的数据类型。默认为 U_WORD

    • 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 位整数,低字在前)
    • U_QWORD_R(来自 4 个寄存器的有符号 64 位整数,低字在前)
  • register_count (可选):此选择器使用的寄存器数量。仅用于不常见的响应编码或 优化 modbus 通信。覆盖由 value_type 确定的默认值。

  • skip_updates (可选, int):默认情况下,modbus_controller 的所有传感器会一起更新。对于不经常变化的数据点,可以跳过更新。值为 5 表示仅在第 6 个更新周期更新此传感器范围。注意:modbus_controller 按地址范围对组件进行分组以减少事务数量。所有具有相同起始地址的组件将在一个请求中更新。skip_updates 适用于同一范围内的 所有 组件。

  • force_new_range (可选, boolean):如果可能,具有连续地址的传感器会被分组并在一个范围内请求。将此设置为 true 会强制在该地址开始新的范围。

  • lambda (可选, lambda):每个更新间隔要评估的 lambda,用于获取选择器的当前选项。

    传递给 lambda 的参数

    • x (int64_t):modbus 数据的解析整数值。

    • data (const std::vector<uint8_t> &):包含此传感器完整原始 modbus 响应字节的向量。注意:因为响应包含同一范围内所有寄存器的数据,您必须使用 data[item->offset] 获取传感器的第一个响应字节。

    • item (ModbusSelect*const):传感器对象本身。

    lambda 的可能返回值:

    • return <std::string>; 此选择器的新选项。
    • return {}; 使用默认映射(参见 optionsmap)。
  • write_lambda (可选, lambda):在传感器每次更新时、将新值写入 modbus 寄存器之前要评估的 lambda。

  • use_write_multiple (可选, boolean):默认情况下,如果只设置一个寄存器,则使用 modbus 命令 功能码 6(预置单个寄存器) 来设置保持寄存器。如果您的设备只支持 功能码 16(预置多个寄存器),请将此选项设置为 true

  • optimistic (可选, boolean):是否以乐观模式运行——在此模式下,发送到 Modbus 选择器的任何命令都会立即更新报告的状态。默认为 false

  • 选择器的所有其他选项。

# 示例
lambda: |-
ESP_LOGD("Reg1000", "接收值 %lld", x);
ESP_LOGD("Reg1000", "从字节解析 0x%x;0x%x", data[item->offset], data[item->offset + 1]);
if (x > 3) {
return std::string("三");
}
  • x (const std::string&):要为此选择器设置的选项值。

  • value (int64_t):使用 optionsmap 映射的 x 值。

  • payload (std::vector<uint16_t> &payload):用于有效载荷的空向量。Lambda 可以添加将发送到 modbus 设备的 16 位原始 modbus 寄存器字。

  • item (ModbusSelect*const):传感器对象本身。

lambda 的可能返回值:

  • return <int64_t>; 应写入配置的 modbus 寄存器的值。如果有数据写入 payload,则忽略此值。
  • return {}; 跳过更新寄存器。
# 示例
write_lambda: |-
ESP_LOGD("Reg1000", "设置选项为 %s (%lld)", x.c_str(), value);
// 从 optionsmap 重用默认选项值
if (value == 0) {
return value;
}
// 返回自己的选项值
if (x == "一") {
return 2;
}
// 写入有效载荷
if (x == "二") {
payload.push_back(0x0001);
return 0; // 任何值都可以
}
// 忽略更新
return {};
# 示例配置条目
select:
- platform: modbus_controller
name: "Modbus 选择器寄存器 1000"
address: 1000
value_type: U_WORD
optionsmap:
"": 0
"": 1
"": 2
"": 3