跳转到内容

Modbus 控制器输出

modbus_controller 平台从 modbus_controller 创建输出。目标是将值写入设备上的 modbus 寄存器。

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

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

    • U_WORD(无符号 16 位整数,来自 1 个寄存器 = 16 位)
    • S_WORD(有符号 16 位整数,来自 1 个寄存器 = 16 位)
    • U_DWORD(无符号 32 位整数,来自 2 个寄存器 = 32 位)
    • S_DWORD(有符号 32 位整数,来自 2 个寄存器 = 32 位)
    • U_DWORD_R(无符号 32 位整数,来自 2 个寄存器,低字在前)
    • S_DWORD_R(有符号 32 位整数,来自 2 个寄存器,低字在前)
    • U_QWORD(无符号 64 位整数,来自 4 个寄存器 = 64 位)
    • S_QWORD(有符号 64 位整数,来自 4 个寄存器 = 64 位)
    • U_QWORD_R(无符号 64 位整数,来自 4 个寄存器,低字在前)
    • S_QWORD_R(有符号 64 位整数,来自 4 个寄存器,低字在前)
    • FP32(32 位 IEEE 754 浮点数,来自 2 个寄存器)
    • FP32_R(32 位 IEEE 754 浮点数——与 FP32 相同但低字在前)
  • register_type (可选):

    • coil:写线圈——使用功能码 5 或 15写入设备中离散线圈的 ON/OFF 状态。这将创建一个二进制输出。
    • holding:写保持寄存器——使用功能码 6 或 16写入设备中保持寄存器的内容。这将创建一个浮点输出。
  • multiply (可选, 浮点数):在写入设备之前将传入值乘以此因子。如果定义了 write_lambda 则忽略。仅对 register_type: holding 有效。

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

  • write_lambda (可选, lambda): Lambda 在创建 modbus 写入命令之前进行求值。值作为 float x 传入,空向量作为 std::vector<uint16_t> &payload 传入。 您可以通过向 payload 添加数据来直接定义 payload,然后返回值被忽略,使用 payload 的内容。

    传递给 lambda 的参数

    • x(浮点数或布尔值):对于 register_type: holding,要发送到 modbus 设备的浮点值;对于 register_type: coil,要发送到 modbus 设备的布尔值

    • payloadstd::vector<uint16_t> &payload):

      • 对于 register_type: holding:payload 的空向量。lambda 可以添加 16 位原始 modbus 寄存器字。
      • 对于 register_type: coil:payload 的空向量。如果在 lambda 中设置了 payload,它将作为自定义命令发送,必须包含 modbus 请求所需的所有字节 注意:因为响应包含同一范围内所有寄存器的数据,您必须使用 data[item->offset] 获取传感器的第一个响应字节。
    • item(指向 SensorItem 派生对象的常量指针):传感器对象本身。

    lambda 的可能返回值:

    • return <浮点数 / 布尔值>; 传感器的新值。
    • return <任何值>; 并用数据填充 payload 如果从 lambda 添加了 payload,则这些 16 位字将被发送
    • return {}; 如果您不想将命令写入设备(或在 lambda 中执行此操作)。
  • offset (可选, 整数):相对于起始地址的字节偏移量(仅对于不常见的响应编码需要)。如果在命令中写入多个寄存器,此值用于找到此数据点相对于起始地址的开始位置。组件根据偏移量和值类型的大小计算范围的大小。

  • id (可选, ID):手动指定用于代码生成的 ID。

所有其他选项来自 Output

output:
- platform: modbus_controller
modbus_controller_id: modbus1
address: 2048
register_type: holding
value_type: U_WORD
multiply: 1000

使用 lambda 的相同配置:

output:
- platform: modbus_controller
modbus_controller_id: modbus1
address: 2048
value_type: U_WORD
write_lambda: |-
ESP_LOGD("main","Modbus Output incoming value = %f",x);
uint16_t value = x ;
payload.push_back(value);
return x * 1000 ;