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("三"); }传递给 write_lambda 的参数
Section titled “传递给 write_lambda 的参数”-
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