跳转到内容

Modbus 控制器数字

modbus_controller 平台从 modbus_controller 创建数字。 当数字更新时,会创建 modbus 写入命令并发送到设备。

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

  • value_type (必填):modbus 寄存器数据的数据类型。modbus 的默认数据类型是大端格式的 16 位整数(MSB 优先):

    • 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 相同但低字在前)
  • min_value (可选, float):此数字可以具有的最小值。

  • max_value (可选, float):此数字可以具有的最大值。

  • step (可选, float):设置数字的粒度。默认为 1。

  • multiply (可选, float):在发送请求之前将新值乘以此因子。如果定义了 lambda 则忽略。

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

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

  • register_count (可选, int):此读取请求在单个命令中应跨越或跳过的连续寄存器数量。默认为 1。有关更多详细信息,请参阅 优化 modbus 通信

  • response_size (可选):寄存器响应的大小(以字节为单位)。默认为 register_count*2。

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

  • offset (可选, int):从起始地址的字节偏移量(仅用于不常见的响应编码)。如果在一个命令中写入多个寄存器,则此值用于查找此数据点相对于起始地址的开始位置。组件根据偏移量和值类型的大小计算范围的大小。

  • custom_command (可选, 字节列表):modbus 命令的原始字节。这允许使用非标准命令。如果使用 custom_command,则不能使用 addressregister_type。 自定义数据必须包含所有必需的字节,包括 modbus 设备地址。CRC 会自动计算并附加到命令中。 请参阅 使用 custom_command 了解如何使用 custom_command

  • lambda (可选, lambda): 每个更新间隔要评估的 lambda,用于获取传感器的新值。

    传递给 lambda 的参数

    • x (float):modbus 数据的解析浮点值

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

    • item(指向 SensorItem 派生对象的常量指针):传感器对象本身。

    lambda 的可能返回值:

    • return <FLOATING_POINT_NUMBER>; 传感器的新值。
    • return NAN; 如果状态应被视为无效以指示错误(高级用法)。
  • write_lambda (可选, lambda):发送前调用的 lambda。 Lambda 在创建 modbus 写入命令之前进行评估。

    传递给 lambda 的参数

    • x (float):要发送到 modbus 设备的浮点值

    • payload (std::vector<uint16_t> &payload):用于有效载荷的空向量。Lambda 可以添加 16 位原始 modbus 寄存器字。 注意: 因为响应包含同一范围内所有寄存器的数据,您必须使用 data[item->offset] 获取传感器的第一个响应字节。

    • item(指向 SensorItem 派生对象的常量指针):传感器对象本身。

    lambda 的可能返回值:

    • return <FLOATING_POINT_NUMBER>; 传感器的新值。
    • return <anything>; 并用数据填充 payload 如果从 lambda 添加了有效载荷,则这些 16 位字将被发送
    • return {}; 如果您不想将命令写入设备(或在 lambda 中执行此操作)。
  • 数字的所有其他选项。

number:
- platform: modbus_controller
modbus_controller_id: modbus1
id: battery_capacity_number
name: "电池容量数字"
address: 0x9001
value_type: U_WORD
multiply: 1.0
- platform: modbus_controller
modbus_controller_id: modbus1
id: battery_capacity_number
name: "电池容量数字"
address: 0x9001
value_type: U_WORD
lambda: "return x * 1.0; "
write_lambda: |-
ESP_LOGD("main","Modbus 数字传入值 = %f",x);
uint16_t b_capacity = x ;
payload.push_back(b_capacity);
return x * 1.0 ;