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 相同,但低字在前)
-
register_type (可选):
coil: Write Coil —— 使用 功能代码 5 或 15 写入设备的离散继电器 ON/OFF 状态。这将创建一个二进制输出。holding: Write Holding Registers —— 使用 功能代码 6 或 16 写入设备的保持寄存器内容。这将创建一个浮点输出。
-
multiply (可选, float): 在将值写入设备之前,将此因子与传入值相乘。如果定义了
write_lambda,则忽略。仅对register_type: holding有效。 -
use_write_multiple (可选, boolean): 默认情况下,如果只设置一个寄存器,会使用 modbus 命令 功能代码 6(预设单个寄存器) 来设置保持寄存器。如果你的设备仅支持 功能代码 16(预设多个寄存器),请将此选项设置为
true。 -
write_lambda (可选, lambda): 在创建 modbus 写命令之前对 lambda 求值。值作为
float x传入,空向量作为std::vector<uint16_t> &payload传入。 你可以通过向 payload 添加数据来直接定义 payload,此时返回值将被忽略,并使用 payload 的内容。传入 lambda 的参数
-
x (float 或 bool): 对于
register_type: holding,要发送到 modbus 设备的浮点值;对于register_type: coil,要发送到 modbus 设备的布尔值 -
payload (
std::vector<uint16_t> &payload):- 对于
register_type: holding: 空的 payload 向量。lambda 可以添加 16 位原始 modbus 寄存器字。 - 对于
register_type: coil: 空的 payload 向量。如果在 lambda 中设置 payload,它作为自定义命令发送,并且必须包含 modbus 请求所需的所有字节 注意:因为响应包含同一范围内所有寄存器的数据,你必须使用data[item->offset]来获取传感器的第一个响应字节。
- 对于
-
item (指向 SensorItem 派生对象的 const 指针): 传感器对象本身。
lambda 的可能返回值:
return <FLOATING_POINT_NUMBER / BOOL>;传感器的新值。return <anything>; and fill payload with data如果从 lambda 添加 payload,则这些 16 位字将被发送return {};如果你不想将命令写入设备(或者从 lambda 中执行)。
-
-
offset (可选, int): 相对于起始地址的字节偏移量(仅在不常见的响应编码中需要)。如果一个命令中写入多个寄存器,则此值用于查找此数据点相对于起始地址的起始位置。组件根据偏移量和值类型大小计算范围大小。
-
id (可选, ID): 手动指定用于代码生成的 ID。
所有其他选项请参见 输出。
output: - platform: modbus_controller modbus_controller_id: modbus1 address: 2048 register_type: holding value_type: U_WORD multiply: 1000lambda 版本相同:
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 ;