本页目录
规则引擎
打开“开发配置 → 规则引擎”,添加节点、填写参数并连线,校验和保存后启用流程。新建规则默认禁用。
做一个大于 100 的判断
先按内存计算创建 Memory.ManualValue,仅用于本次练习。
- 点击列表右上方的加号(新增规则),名称填“演示值判断”,点击“创建未启用规则”进入编辑器。
- 在左侧搜索“变量通知规则”,将它拖到画布。
- 选中这个节点,在右侧把
DeviceNames填为Memory,VariableNames填为ManualValue。其他筛选条件留空。 - 搜索“大于”,从“比较运算”分类拖入“大于”节点,不要选“大于等于”。点击画布上节点的标题,在右侧“自定义初始输入参数”中把
InputB填为100;InputA不填写,它由连线传入。 - 添加“类型转换 → JSON 数值提取”,将通知节点的
Result连接到数值提取的Input,再把数值提取的Result连接到“大于”的InputA。这样可明确检查输入是否为有效数字。 - 点击“校验流程”,处理错误后点击右上角对勾图标保存;确认“已保存”,再点击“启用”,核对“已装载”的版本。
- 到内存计算,把
ManualValue写为101,回到规则编辑器并选中“大于”节点。在右侧切换到“运行”页签,打开“实时参数值”,查看“输出参数”的Result,应为true;“输入参数”中InputA为101,InputB为100。 - 再写为
99,Result应变为false。完成后在流程详情顶部点击“禁用”。
变量通知规则监听值变化。一直写同一个值,不一定产生新的触发。本例只做判断,不写入设备、不发送通知。
完成规则配置后,在“运行”页签查看 Result 字段,并按后续三节点示例验证连线与输出。
右侧“配置”页签中的“自定义初始输入参数”用于设置起点;连线传入的 InputA 在“运行 → 实时参数值”中查看。
接下来做什么
| 需要的功能 | 查看位置 |
|---|---|
| 修改节点、连线或删除节点 | 画布操作 |
| 把判断结果写回内部变量 | 变量、事件与写回节点 |
| 产生报警时发送邮件 | 报警配置与邮件通知 |
| 发送到 HTTP 接口或消息机器人 | Webhook 推送节点 |
| 备份和恢复流程 | 导入导出 |
修改生产流程前先导出备份。
创建和编辑流程
流程列表
规则引擎列表用于管理流程基本信息、启停状态和规则包。
| 区域或列 | 说明 |
|---|---|
| 搜索名称 | 按流程名称查询列表。输入关键字后按回车或清空输入框会刷新结果。 |
| 新增规则 | 创建新的规则流程。页面会先要求输入流程名称,创建成功后自动打开流程编辑器。 |
| 导出规则包 | 按当前名称筛选导出 JSON 规则包,包含流程定义、画布布局和依赖说明。 |
| 导入规则包 | 选择 JSON 规则包,逐条确认新建、跳过或替换,再检查导入结果。 |
| 批量删除 | 勾选流程后批量删除。删除前应先确认流程不再参与生产运行。 |
| 刷新 | 重新加载流程列表和可用自定义节点。 |
| 流程名称 | 规则流程名称。名称应能体现流程用途,便于日志排查。 |
| 描述 | 流程用途说明。为空时列表显示 -。 |
| 版本 | 流程版本号。新建流程默认从 v1 开始。 |
| 配置状态 | 显示保存的启用状态;实际运行情况继续检查“实际装载实例”。 |
| 实际装载实例 | 显示运行实例及其装载的定义版本;观察失败时结合运行日志检查。 |
| 操作 | “详情”进入编辑器配置、校验和启停;删除前确认该流程已退出运行。 |
新建流程
- 点击列表右上角“新增规则”。
- 在提示框中输入流程名称。
- 点击“创建未启用规则”后,系统创建禁用的
v1流程并进入编辑器。 - 在编辑器中维护流程描述、触发方式、节点、连线和参数。
- 点击“校验流程”,按诊断定位到节点或连线,处理必填输入、类型和环路等错误。
- 点击“保存”。禁用规则可保存尚未配置完整的草稿,但必须通过执行校验后才能启用。
- 点击“启用”,确认配置状态、实际装载版本和本次运行值。已启用规则的保存按钮为“保存并重新装载运行规则”,会应用到运行侧,应安排合适的操作窗口。
修改草稿后重新校验。多人编辑产生版本冲突时,先保留自己的改动,再读取最新流程核对。
流程编辑器
点击流程行的“详情”进入流程编辑器。
| 区域 | 说明 |
|---|---|
| 顶部信息区 | 显示流程名称、流程描述、版本号和触发方式。流程名称、描述可以直接编辑。 |
| 校验流程 | 检查当前草稿并定位诊断,不保存或执行流程。 |
| 保存按钮 | 保存当前流程及画布。禁用时保存草稿,启用时保存并重新装载运行规则。 |
| 启用 / 禁用 | 控制运行。禁用流程有未保存改动时,先保存再启用。 |
| 返回按钮 | 返回规则流程列表。离开前应确认当前修改已经保存。 |
| 防抖 / 无限制触发 | “防抖”会合并短时间内的重复变化;“无限制触发”会在每次变化时直接触发下游节点。 |
| 撤销 / 重做 | 恢复或重做画布编辑。 |
| 连接关系 | 按源节点、输出端口、目标节点和输入端口维护连线,支持定位,适合节点较多的流程。 |
| 搜索全图 | 根据节点名称、稳定身份及连线信息搜索并定位。 |
| 布局与选择 | 对齐、分布、选择上下游或创建可视分组。可视分组只整理布局,节点仍按连线执行。 |
| 缩放 / 适配全图 | 调整视图,结合小地图查看大流程。 |
| 自动布局 | 根据当前节点和连线重新排列画布。节点较多或连线交叉时使用。 |
| 删除选中 | 删除当前选中的节点或连线。 |
| 左侧节点面板 | 按分类展示可用节点,支持按节点名称搜索和按分类筛选。 |
| 中间画布 | 拖拽节点、连接端口、调整布局、选择节点或连线。 |
| 右侧属性面板 | 选中节点后显示,用于编辑节点名称、查看节点类型、填写输入参数和输入输出参数。 |
| 运行日志面板 | 查看规则引擎运行日志,支持按级别、时间范围和关键字筛选,可导出当前页或全部日志。 |
节点面板
节点面板中的节点来自已加载的内置节点和自定义节点。常见分类包括保持、比较运算、边沿检测、变量 RPC、常量、触发器、定时器、计数器、类型转换、逻辑运算、数据统计、数据推送、数学运算、条件判断和字符串处理。
| 操作 | 说明 |
|---|---|
| 搜索节点 | 在“搜索节点”输入节点名称或标识关键字,快速定位节点。 |
| 分类筛选 | 在“全部分类”下拉框选择分类,仅显示该分类下的节点。 |
| 展开/折叠分组 | 点击分类标题展开或折叠节点组。 |
| 添加节点 | 拖入画布,或点击“添加到画布”按钮;再在右侧检查参数。 |
| 收藏节点 | 将常用节点加入收藏,便于重复编排。 |
如果节点没有出现在列表中,先确认对应脚本或自定义节点已经编译成功,再刷新规则引擎页面。
画布操作
| 操作 | 步骤 |
|---|---|
| 添加节点 | 从左侧节点面板拖拽节点到画布。 |
| 连接节点 | 从一个节点端口拖到另一个节点端口,建立数据传递关系。连接方向应从上游输出端口指向下游输入端口。 |
| 配置节点 | 选中节点,在右侧属性面板修改节点名称、输入参数和输入输出参数。 |
| 重命名节点 | 双击画布中的节点,输入新的节点显示名称。 |
| 删除节点或连线 | 选中节点或连线后点击“删除选中”。 |
| 自动布局 | 点击“自动布局”,让系统按当前连线关系重新排列节点。 |
| 保存流程 | 点击右上角“保存”,保存当前画布和参数。 |
“快捷操作”可查看复制、粘贴和选择操作。跨流程复制后,核对节点依赖、设备名称、变量名称和外部连接参数,再校验流程。
节点参数
节点参数由节点类型决定。不同节点会显示不同的输入、输出和输入输出参数。
| 参数类型 | 说明 |
|---|---|
| 输入参数 | 状态输入可填写初始值或从上游接收;事件输入只接收事件,不设置状态初值。 |
| 输出参数 | 分为持续状态和离散事件,连接时需与目标端口的语义及类型一致。 |
| 输入输出参数 | 既可接收上游数据,也可在节点处理后继续输出。 |
| 自定义初始输入参数 | 部分节点支持在属性面板中填写初始输入值,用于无上游输入或默认值场景。 |
| 实时参数值 | 流程启用并运行后,属性面板和节点端口可显示当前节点的输入、输出和输入输出值。 |
端口按名称绑定,连接还会检查事件/状态、数值类型、数组、可空性和单位。Object 到数值的动态连接可能出现转换提示;无效数字、溢出或不允许的空值会使目标执行失败。使用“JSON 数值提取”“整数转十进制”等转换节点明确数据形态;事件与状态之间使用相应的转换节点,不能只改端口名称。
“清除配置值”表示取消显式初值,恢复节点定义的起点,不等于写入空字符串或 null。右侧“节点参数”控制合并策略、批次大小等设置;“高级执行策略”控制超时和重试,二者都不作为业务端口连线。
高级执行策略
选中节点,在右侧“配置”页签展开“高级执行策略”。这些字段控制当前节点的执行,不作为业务端口连接到其他节点。
| 参数 | 说明 |
|---|---|
OutputOnlyOnChange | 默认 true。状态输出只在值变化时向下游传播;关闭后每次赋值都可传播。事件输出可重复投递相同值。该开关不限制节点自身的发送次数。 |
ExecutionTimeoutMilliseconds | 默认 30000 毫秒,范围 100–600000。是一次执行的总期限,包含全部尝试与退避等待,不是每次尝试各自重新计时。 |
MaxExecutionAttempts | 默认 1,范围 1–5,包含首次执行。仅对节点明确识别的瞬时故障进行有限重试;配置为 2 不表示所有失败都会再执行一次。 |
RetryBackoffMilliseconds | 默认 250 毫秒,范围 0–60000。首次重试的基础等待,后续按两倍增长,基础部分最多 60000 毫秒。只有发生重试时才等待。 |
RetryJitterMilliseconds | 默认 100 毫秒,范围 0–10000。在每次退避上随机附加 0 到此上限的等待;设为 0 关闭随机附加。 |
总期限应能容纳预计处理时间和退避。超时不会撤销已经发出的设备写入或外部消息。设备写入、MQTT、邮件和 Webhook 一旦开始外部操作,结果未确认时可能为 UnknownEffect,不会因为增加尝试次数就盲目重发;应先核对真实接收端或设备状态。业务拒绝、取消和超时也不能作为通用重试条件。
运行值与执行结果
切换到右侧“运行”页签,先核对采样更新时间、当前活动和最近执行结果,再查看输入、输出、输入输出值。“诊断详情”可展开流程实例、装载版本、快照序号、执行完成时间、执行身份、错误码和累计次数。采样更新时间表示读取观察值的时间,执行完成时间才对应最近结束的执行。
保存并重新装载后,确认当前实例与装载版本;累计次数属于当前实例。采样超过 5 秒未更新会显示“采样已过期”,观察请求失败时点击“重新观察”。核对本次输入时,同时查看执行完成时间和执行结果。
| 最近执行状态 | 处理方法 |
|---|---|
Succeeded | 本次节点执行成功;仍需到设备或接收端核对业务结果。 |
Skipped | 显示“已跳过 · 未执行”,节点明确报告本次条件不满足。查看“未执行原因”和原因码;不会把上一次输出当成本次新输出。 |
BusinessRejected | 参数、权限、禁用条件或远端明确拒绝,按错误码处理。 |
Faulted | 查看本次错误及实际尝试次数,区分配置和瞬时故障。 |
TimedOut | 总期限已到,检查外部耗时、重试和退避配置。 |
Canceled | 检查流程停止、重载或取消操作。 |
UnknownEffect | 外部操作已开始但结果未确认;先回读或核对接收记录,再决定后续处理。 |
需要把节点执行结果接入流程时,将 ExecutionResult 事件输出连接到执行错误捕获节点的 Input。成功和显式跳过都可被观察,但捕获节点忽略这两类结果,只输出错误或取消结果。业务输出与执行结果分开连接,不用执行事件直接充当设备写入值。
当前活动与等待说明
| 当前状态 | 含义与检查方法 |
|---|---|
| 等待触发 | 当前没有执行中或排队工作。查看等待说明,例如下次周期、启用条件、触发信号上升沿或回零。 |
| 等待调度 | 已接收输入,正在等待前序执行或合并间隔结束;结合排队深度和合并次数判断负载。 |
| 正在执行 | 当前执行尚未结束,包括延时节点内部的异步等待。 |
当前活动与最近结果可以同时显示:节点上次执行成功后会继续等待,下次条件不满足也可显示跳过。周期之间的正常等待不应解释为执行失败或新的一次跳过。
连接运行明细
打开“实时参数值”,选中源节点,再展开右侧“连接运行明细”。逐条查看输出端口到目标输入的最近活动、原因、执行身份及时间;“上次投递结果”和“上次投递时间”单独保留。
| 连接状态 | 含义 |
|---|---|
| 已投递 | 目标已接收,仍需查看目标节点的执行结果。 |
| 已合并待执行 | 状态已合入目标后续执行,不表示每个中间状态都会分别执行。 |
| 投递被拒绝 | 检查目标容量、停止状态及原因码;其他分支可能已经接收。 |
| 值未变化,未传播 | 状态输出被“仅变化输出”策略过滤;源节点本次仍可能已执行。 |
| 源节点跳过 | 源节点明确报告条件不满足,查看具体原因。 |
| 本次未写入端口 | 源执行成功返回,但这一次没有写入此端口。 |
| 源节点未成功,未传播 | 源执行失败、取消或超时,本次没有从此连接发布输出。 |
| 尚无活动 | 当前实例尚未观察到该连接活动。 |
画布绿色仅短暂表示最近 3 秒发生投递;绿色虚线表示合并接收,黄色虚线表示源节点跳过,红色表示投递或源执行失败,灰色表示未传播或尚无活动。采样过期时不保留成功色。以文字明细为准,绿色消退不表示流程停止,“已投递”也不表示目标业务成功。
同一源节点扇出到多个目标时,每条连接分别核对。一次部分投递失败不会撤回其他目标已接收的输入;节点显式提交过的中间输出也不会因后续失败自动回滚。
导入导出
规则配置使用 JSON 规则包备份和交换。日志导出独立于规则包,不用于恢复流程。
| 入口 | 位置 | 用途 |
|---|---|---|
| 导出规则包 | 流程列表工具栏 | 按当前名称筛选导出一个或多个流程,包含定义、布局、依赖和脱敏字段清单。 |
| 导入规则包 | 流程列表工具栏 | 选择 JSON 包并逐条确认冲突处理,查看创建、替换和跳过数量。 |
| 导出日志 | 运行日志面板 | 导出当前页或全部规则运行日志,用于排查和归档。 |
- 在列表按名称筛选所需流程,点击“导出规则包”,妥善保存 JSON 文件。
- 在目标网关点击“导入规则包”,选择文件,核对每条流程的名称、节点数、连线数、依赖和已脱敏字段。
- 没有同名流程时选择新建;同名流程默认跳过。确需替换时先导出现有流程作备份,再明确选择替换。
- 导入后逐条检查节点类型与自定义节点依赖,补齐密码、令牌等脱敏配置,校验后保存。
- 导入的规则保持禁用;确认现场设备、变量与接收端后再逐条启用,核对实际装载版本和结果。
规则包记录节点依赖,不携带自定义节点 DLL。目标网关应先部署并编译所需节点。替换时若流程已被其他人修改,重新读取并核对后处理;不要强行覆盖。出现运行重载错误时,配置导入与运行应用分别核对,不能只凭导入数量认定已经生效。
节点与触发方式
触发方式
| 配置 | 使用建议 |
|---|---|
| 防抖 | 适合温度、压力、液位等高频变化数据,可减少短时间内的重复执行。 |
| 无限制触发 | 跳过流程防抖等待,适合需要逐次消费变化的场景;单节点仍受串行执行与容量约束,不表示无限并发或保证任意速率不丢事件。 |
注意
启用“无限制触发”可能增加运行负载。生产环境使用前,应先评估变量变化频率、流程复杂度和下游系统承载能力。
定时、状态与事件
定时器用于明确触发时刻,不能代替设备写入确认。选中节点后,输入值在“自定义初始输入参数”中填写,容量、策略等设置在节点参数区维护。
| 节点 | 配置与运行行为 |
|---|---|
| 延时 | Input 是小数值,DelayMs 为非负毫秒数;等待结束后,Output 输出本次输入快照,Completed 产生一次完成事件。等待期间显示正在执行,延时须留在节点总超时以内。 |
| 周期定时器 | IntervalTime 默认 1000,可填毫秒周期或支持的 Cron 表达式;每周期产生一次 Tick=true 事件,并递增状态计数 Count。Enabled=false 时不发布、不计数;周期变化会重建定时任务。 |
| 单次定时器 | Trigger 从假到真后,等待非负的 DelayMs,再输出约 100 ms 的真脉冲并复位;再次触发前需先把 Trigger 置假。运行面板可查看等待上升沿或回零的说明。 |
周期定时器的 Tick 是事件,每次载荷都可以为 true。连接普通布尔状态输入前,使用“布尔事件转状态”;持续状态需要形成逐次事件时,使用“布尔状态转事件”。JSON 载荷同样提供状态与事件转换节点。转换节点明确改变语义,不会自动产生定时脉冲。
- 新建禁用的练习流程,添加周期定时器,设置
IntervalTime=1000、Enabled=true。 - 连接事件端口时选择相同事件语义;需要数值运算时,将
Count经“整数转十进制”连接到小数输入。 - 校验、保存并启用,观察
Count增长以及每次事件的下游执行次数。 - 测试单次定时器时按假、真、假、真的顺序输入,分别观察延时、输出和复位;完成后禁用练习流程。
流程停止或重新装载会取消仍在等待的动作并释放定时任务。重新装载建立新实例,计数和节点内部状态重新开始。
数据流与共享上下文
“数据流”分类用于选择状态、拆分或汇合事件,以及在同一流程实例中保存少量共享 JSON 数据。先确认连线是状态还是事件,再配置容量和关联条件。
| 节点 | 参数与用途 |
|---|---|
| 状态合并 | Primary、Secondary 接收两路 JSON 状态;Strategy 选择 Latest、Primary 或 Secondary。同批更新时由 TieBreaker 明确优先输入,默认 Primary;Value 输出选中状态,Source 指明来源。 |
| 事件拆分 | Input 接收数组事件,从 Item 逐项输出带关联身份和序号的子事件;MaxItems 默认 256,范围 1–1024,单次总载荷不超过 1 MiB。 |
| 事件批处理 | Item 收集事件,达到 BatchSize 或收到 Flush 事件后从 Batch 输出;批量默认 32,范围 1–256。按数量或显式刷新聚合,不是时间窗口或持久队列。 |
| 事件汇合 | Left、Right 按关联身份匹配;TimeoutMilliseconds 默认 5000,MaxPending 默认 256。分别观察 Joined、TimedOut、Rejected,不要把仅一路到达视为配对完成。 |
| 上下文写入 | Value 提供 JSON 状态,收到 Write 事件后写入 Key,从 Written 输出结果。 |
| 上下文读取 | 收到 Read 事件后查询 Key;Found 表示是否存在,命中时才输出 Value。未命中时不要继续使用上次保留值。 |
| 上下文删除 | 收到 Remove 事件后删除 Key,从 Removed 输出结果。 |
Flush、Write、Read、Remove 是事件输入,事件到达即消费,布尔载荷不必为 true。拆分、批处理和汇合携带事件信封,联调时同时检查关联身份、序号和实际载荷,避免把信封整体当作数值。
上下文的默认键为 shared.value,键名为 1–64 个 ASCII 字母、数字或 .、_、-。每个流程实例最多 128 个键,单值不超过 64 KiB,总量不超过 1 MiB;不同流程不共享,停止、重载或重启后不恢复。事件批次与待汇合数据也应在重载前处理完毕,需要保留记录时交给持久化目标。
变量、事件与写回节点
这组节点直接使用网关的变量、报警和设备状态事件。事件节点不需要上游输入,流程启用后会等待对应事件;筛选条件全部满足时才向下游输出。多个名称或枚举值使用英文逗号分隔,留空表示不按该条件筛选。
变量通知规则
“触发器 → 变量通知规则”监听在线变量的值变化,适合把采集变量接入阈值判断、记录或通知流程。节点匹配成功后同时输出当前变量值和完整变量数据对象。
| 方向 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| 输入 | DeviceNames | 空 | 设备名称列表,多个值用英文逗号分隔;留空匹配所有设备。 |
| 输入 | VariableNames | 空 | 变量名称列表,多个值用英文逗号分隔;留空匹配所有变量。 |
| 输入 | CollectGroups | 空 | 采集组名称列表,多个值用英文逗号分隔;留空匹配所有采集组。 |
| 状态输出 | Result | - | 匹配变量的当前 Value;接数值比较前使用“JSON 数值提取”,并按实际类型选择后续转换节点。 |
| 状态输出 | VariableBasicData | - | 匹配变量的完整 JSON 快照;先接“JSON 状态转事件”,再连接 Webhook、邮件或 MQTT 节点的 Data/InputData 事件输入。 |
变量离线时不会触发该节点。需要区分数据来源时,优先使用 VariableBasicData,其中包含变量名称、设备名称、采集组、在线状态、变更时间和采集时间等字段。
同一字段中的多个名称表示可匹配集合;设备名、变量名和采集组之间则同时约束。例如设备填 Memory、变量填 ManualValue、采集组填 LineA,只有三个条件均符合才进入下游。验证筛选时保留一个未匹配的对照输入,修改条件后再写入不同的新值。
告警通知规则
“触发器 → 告警通知规则”监听报警生命周期事件,并按级别、设备、事件类型和报警类型筛选。匹配后从 FilteredAlarmData 输出原始报警对象。
| 方向 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| 输入 | MinAlarmLevel | 0 | 最低报警级别。报警级别小于此值时忽略;0 表示不按级别筛选,实际级别范围以变量报警配置为准。 |
| 输入 | DeviceNames | 空 | 设备名称列表;留空匹配所有设备。 |
| 输入 | EventTypes | 空 | 事件类型列表:Restart、PrepareAlarm、Alarm、PrepareFinish、Finish、Confirm、ConfirmAndFinish。留空匹配所有事件。 |
| 输入 | AlarmTypes | 空 | 报警类型列表:Open、Close、HH、H、L、LL、Custom、State。留空匹配所有类型。 |
| 输入 | DebounceMs | 0 | 同一设备和变量的防抖毫秒数;0 表示不防抖。 |
| 输入 | Enabled | true | 关闭后忽略报警事件。 |
| 事件输出 | FilteredAlarmData | - | 匹配成功时输出报警 JSON 快照;可连接到通知节点的 Data 事件输入。 |
设备通知规则
“触发器 → 设备通知规则”监听设备状态变化,可用于设备离线告警、恢复通知和按插件分流。
| 方向 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| 输入 | DeviceNames | 空 | 设备名称列表;留空匹配所有设备。 |
| 输入 | DeviceStatuses | 空 | 状态列表:OnLine、OffLine、Pause;留空匹配所有状态。 |
| 输入 | PluginNames | 空 | 采集插件名称列表;留空匹配所有插件。 |
| 输入 | DebounceMs | 0 | 同一设备的防抖毫秒数;0 表示不防抖。 |
| 输入 | Enabled | true | 关闭后忽略设备状态事件。 |
| 事件输出 | FilteredDeviceData | - | 匹配成功时输出设备数据 JSON 快照,可连接到通知节点的 Data 事件输入。 |
变量 RPC 节点
“变量RPC节点”用于通过规则流程调用变量的 RPC 写入能力。它会按 DeviceName 和 VariableName 查找变量,再把 WriteData 转为 JSON 参数调用变量运行时的 RPC;不要绕过变量权限直接调用驱动。
| 方向 | 参数 | 说明 |
|---|---|---|
| 输入 | DeviceName | 目标设备名称,必须与运行中的设备完全一致。 |
| 输入 | VariableName | 目标变量名称,必须具备可执行的 RPC/写入能力。 |
| 输入 | WriteData | 写入值或方法参数;对象、数组和标量均按 JSON 传递。 |
| 输出 | Result | 写入结果,包含成功状态、返回内容或错误信息,可连接到条件节点或日志流程。 |
建议将变量 RPC 节点放在上升沿、按钮触发或互锁判断之后,避免高频变量变化造成重复写入。验证时同时检查 Result、变量写入日志和设备侧实际动作;变量不存在、权限关闭或设备暂停都会返回失败结果。
MQTT 客户端上传节点
“数据推送 → Mqtt客户端上传”节点收到 InputData 事件后,把对象序列化为 UTF-8 JSON 发布到指定主题。支持 TCP MQTT 和 WebSocket MQTT。初始化不主动连接或上传;首次发送、连接断开或连接配置变化时,在本次执行中建立连接,失败处理受高级执行策略约束。
参数说明
| 方向 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| 输入 | Url | mqtt://127.0.0.1:1883 | MQTT 地址。TCP 可使用 mqtt://、mqtts:// 或 tcp://;WebSocket 可使用 ws://、wss://、mqtt-ws:// 或 mqtt-wss://。 |
| 输入 | Topic | data/upload | 发布主题。 |
| 输入 | UserName / Password | 空 | MQTT 登录凭据。密码不会写入运行日志。 |
| 输入 | ClientId | 空 | 客户端标识。留空时每次连接生成随机标识。需要 broker 持久会话时请填写稳定值。 |
| 输入 | Retain | false | 是否保留最后一条消息。只有确实需要新订阅者收到旧值时才启用。 |
| 输入 | Enabled | true | 是否允许发布;关闭时收到发送事件会报告业务拒绝。 |
| 输入 | KeepAlive | 60 | MQTT 保活秒数,需符合 broker 的允许范围。 |
| 输入 | CleanSession | true | 是否使用清理会话。需要持久会话时关闭并配合稳定 ClientId。 |
| 输入 | MqttProtocolVersion | V311 | MQTT 协议版本,按 broker 支持情况选择。 |
| 输入 | QosLevel | AtMostOnce | 服务质量:AtMostOnce(0,最多一次)、AtLeastOnce(1,至少一次)或 ExactlyOnce(2,恰好一次)。 |
| 输入 | UseSSL | false | 是否启用 TLS。启用后按证书参数校验 broker。 |
| 输入 | SslTargetHost | 空 | TLS 目标主机名;留空使用 Url 中的主机名。 |
| 输入 | SslClientCertificateName | 空 | 双向 TLS 使用的客户端证书名称。 |
| 输入 | SslCACertificateName | 空 | 自定义 CA 证书名称。 |
| 输入 | SslAllowUntrusted | false | 是否接受不受信任证书。保持关闭并配置可信 CA;开启会放宽证书验证。 |
| 输入 | SslProtocols | None | TLS 协议版本选择;None 使用系统默认协商。 |
| 输入 | SslCheckCertificateRevocation | false | 是否检查证书吊销状态。 |
| 事件输入 | InputData | - | 上游传入的对象、数组或标量,序列化后作为消息负载;不填写状态初始值。 |
| 事件输出 | ExecutionResult | - | 本次执行状态、身份、尝试次数和错误码;连接执行错误捕获节点后观察。 |
最小配置与验证
- 拖入节点,填写
Url、Topic,按 broker 要求填写用户名和密码。 - 将待推送的数据输出连接到
InputData,按端口提示检查类型和事件语义,并将ExecutionResult接入执行错误捕获节点。 - 先用独立 MQTT 客户端订阅同一主题,再保存并启用流程,触发一次可辨认的新数据。
- 在“运行”页签确认本次执行为
Succeeded,并在订阅端核对主题、JSON 内容和 QoS。Retain=false时,发送后才订阅会错过已经发出的消息。
连接或发布失败时,查看最近执行状态、错误码及运行日志;出现 UnknownEffect 时先核对订阅端记录,再决定是否重发。
邮件推送节点
“数据推送 → 邮件推送”节点收到 Data 事件后使用 SMTP 发送规则数据。节点在第一次发送或邮件配置变化时准备 SMTP 通道,发送受总执行期限约束。
参数说明
| 方向 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| 输入 | Host | 空 | SMTP 服务器地址。 |
| 输入 | Port | 587 | SMTP 服务器端口。 |
| 输入 | EnableSsl | true | 是否启用 SMTP 加密。 |
| 输入 | UserName / Password | 空 | SMTP 认证凭据。 |
| 输入 | FromAddress | 空 | 发件人邮箱地址。 |
| 输入 | FromName | TGateway | 发件人显示名称。 |
| 输入 | ToAddresses | 空 | 收件人地址,多个地址用英文逗号分隔。 |
| 输入 | SubjectTemplate | 告警通知 - {{DeviceName}} - {{EventType}} | 主题模板,使用 {{属性名}} 引用 Data 对象属性;留空使用默认模板。 |
| 输入 | BodyTemplate | 默认 HTML 告警表格 | 正文模板,使用 {{属性名}} 替换;以 < 开头的正文按 HTML 发送,留空使用默认模板。 |
| 输入 | Enabled | true | 是否允许发送。 |
| 事件输入 | Data | - | 上游传入的对象、数组或标量;不填写状态初始值。 |
| 事件输出 | ExecutionResult | - | 本次执行状态、身份和错误信息;连接执行错误捕获节点后观察。 |
| 输出 | LastPushTime | Unix 起始时间 | 最近一次确认发送成功的 UTC 时间,失败时不会推进。 |
最小配置与验证
- 填写 SMTP 主机、端口、用户名、密码、发件人和至少一个收件人。
- 将告警通知规则的
FilteredAlarmData事件输出连接到Data;使用变量通知快照时,先经过“JSON 状态转事件”。 - 根据接收端要求修改主题或正文模板,保存并启用流程。
- 将
ExecutionResult接入执行错误捕获节点后触发一次测试事件。在“运行”页签确认本次状态为Succeeded、LastPushTime已推进,并在收件箱检查正文格式和字段替换结果。
SMTP 认证失败、证书错误或收件人无效时,先查看最近执行状态与错误码,再核对服务器端口、SSL 模式和发件人策略。不要在流程日志或公开文档中记录密码。
Webhook 推送节点
“数据推送 → Webhook推送”节点可把规则结果发送到钉钉自定义机器人、企业微信消息推送(原群机器人)或自定义 HTTP 接口。Platform 在属性面板中以下拉框显示,平台必须显式选择,节点不会根据 URL 自动猜测厂商。
参数说明
| 方向 | 参数 | 说明 |
|---|---|---|
| 输入 | Url | 完整 Webhook 地址。钉钉地址包含 access_token,企业微信地址包含 key。 |
| 输入 | Platform | 枚举下拉配置:DingTalk=钉钉,WeCom=企业微信,Custom=自定义 HTTP 接口。新节点默认 Custom。 |
| 输入 | Headers | 自定义请求头 JSON,例如 {"Authorization":"Bearer <token>"}。钉钉和企业微信通常留空。 |
| 输入 | BodyTemplate | 完整 JSON 请求体模板,使用 {{属性名}} 引用 Data 属性。 |
| 输入 | Secret | 仅钉钉机器人启用“加签”时填写以 SEC 开头的 Secret;企业微信和自定义平台必须留空。 |
| 输入 | Enabled | 是否允许节点发送请求。 |
| 事件输入 | Data | 上游传入的 JSON 快照或自定义对象;变量通知的 VariableBasicData 需先经过“JSON 状态转事件”。 |
| 事件输出 | ExecutionResult | 本次执行状态、身份和错误码。远端明确拒绝时报告业务拒绝;发出请求但结果未确认时可能为 UnknownEffect。 |
| 输出 | LastPushTime | 最近一次确认发送成功的 UTC 时间;失败不会推进。 |
BodyTemplate 中位于 JSON 字符串内的占位符会自动转义引号、反斜杠和换行;位于 JSON 值位置的占位符会保留数值、布尔、数组或对象类型。找不到的属性在字符串内替换为空文本,在值位置替换为 null。
告警通知规则输出连接到 Data 时,自定义 HTTP 接口可使用以下模板。变量名称是 Name,触发值是 AlarmCode;普通变量通知的值字段才是 Value。
{
"device": "{{DeviceName}}",
"variable": "{{Name}}",
"message": "{{AlarmText}}",
"level": {{AlarmLevel}},
"value": {{AlarmCode}}
}这是等待替换的模板正文。报警等级为 1、报警值为 101 时,level 输出数字 1,value 输出字符串 "101",因为 AlarmCode 是文本字段;将它放在引号外不会自动转换为数字。
先把待推送的数据连接到 Data,并将 ExecutionResult 接入执行错误捕获节点。接收端准备就绪后启用流程,触发一条可辨认的新事件;在“运行”页签核对本次执行身份、Succeeded 与推进后的 LastPushTime,再到 HTTP 接收端或消息客户端检查正文。初始化时间或旧的成功时间不能作为本次发送的结果。
钉钉配置
- 将
Platform设为DingTalk。 - 将完整的
https://oapi.dingtalk.com/robot/send?access_token=<机器人Token>填入Url。 - 使用加签安全设置时填写
Secret;使用关键词或 IP 白名单时留空。 - 文本消息可填写以下正文;告警变量名称使用
{{Name}}:
{
"msgtype": "text",
"text": {
"content": "设备:{{DeviceName}}\n变量:{{Name}}\n内容:{{AlarmText}}\n报警值:{{AlarmCode}}"
}
}钉钉 Markdown 使用以下结构:
{
"msgtype": "markdown",
"markdown": {
"title": "网关报警",
"text": "## {{DeviceName}}\n\n{{AlarmText}}"
}
}节点按钉钉官方 HmacSHA256 规则自动追加 timestamp 与 sign,不要在 URL 中手工重复添加。HTTP 2xx 后还会检查响应 JSON,只有 errcode 为数字 0 或钉钉官方成功示例中的数字字符串 "0" 才确认发送成功。错误码 310000 通常表示关键词、时间戳、签名或 IP 白名单校验失败;系统时间与钉钉请求时间误差不能超过 1 小时。
企业微信配置
- 将
Platform设为WeCom。 - 将完整的
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=<消息推送Key>填入Url。 Secret留空。文本消息使用与上面相同的text.content正文,并核对变量名与报警值。- 企业微信 Markdown 必须使用
markdown.content,不能使用钉钉的title、text:
{
"msgtype": "markdown",
"markdown": {
"content": "# {{DeviceName}}\n{{AlarmText}}"
}
}企业微信文本最长 2048 UTF-8 字节,Markdown 最长 4096 UTF-8 字节。节点只有在 HTTP 为 2xx 且企业微信响应 errcode 可解析为整数 0 时确认发送成功。
频率与安全
钉钉每个机器人、企业微信每个消息推送都不能超过每分钟 20 条。高频变量不要直接连接 Webhook 节点,应先使用边沿、阈值、保持、定时器或聚合节点减少触发,并把多条报警合并成摘要。Webhook URL 本身包含发送凭据,不要写入日志、截图、公开文档或代码仓库。
运行与验收
运行日志
规则流程运行后,可在编辑器底部查看运行日志。
| 功能 | 说明 |
|---|---|
| 日志级别 | 按日志级别筛选,例如 Trace、Debug、Info、Warning、Error。 |
| 时间范围 | 按开始时间和结束时间筛选日志。 |
| 关键字 | 按日志内容关键字搜索。 |
| 导出 | 导出当前页或全部匹配日志。 |
| 刷新 | 立即重新加载日志。流程启用时,日志面板会按固定间隔自动刷新。 |
| 最大化 / 还原 | 扩大日志面板,便于查看长日志。 |
| 折叠 / 展开 | 临时收起日志面板,给画布留出更多空间。 |
| 详情 | 打开日志详情抽屉,查看日志内容和异常信息。 |
启用后的运行检查
- 核对实际装载版本。
- 用安全测试值触发流程,从上游到下游查看节点实时参数值。
- 在运行日志中核对触发时间、执行路径、输出结果和异常。
- 到最终接收位置确认结果,例如内存变量、报警、消息目标或外部接口。
从输入到执行结果逐段验证
变量通知节点的 Result 是当前值,VariableBasicData 是包含值、质量和时间的完整快照。连接数值计算时,可以先加“JSON 数值提取”,把通知值明确转为数值,再接比较或数学节点;需要完整身份与时间时使用快照端口。不要把对象、数字、布尔和写入结果混为同一种输入。
- 用设备名称和变量名称限定通知来源;配置多个名称时按字段要求填写,不要让全站变化都进入控制规则。
- 给比较节点设置
InputB=100,通过连线传入InputA。输入端已有连线时,运行值由上游提供,修改该端口的初始值不能代替上游输入。 - 依次写入
101、99、100,核对严格“大于”的结果为true、false、false,同时查看当前输入和执行时间。 - 使用条件节点时,分别设置真、假分支值,例如
900和100,再切换条件核对实际选中的分支。 - 接入变量 RPC 时,明确设备名、变量名和
WriteData;把布尔控制结果送入写入内容,查看Result中的写入业务结果及ExecutionResult中的节点执行结果,再到源端独立回读。
设备特殊方法节点和目标特殊方法节点分别调用选定设备或转发目标公开的方法。选择名称或标识后先检查方法参数,再用两次不同输入观察调用次数和最终效果。普通周期采集、周期上传会同时运行,不能把它们产生的结果算作方法调用的结果。
| 调用方式 | 配置与核对 |
|---|---|
| 设备特殊方法 | DeviceName 或准确的 DeviceId 定位设备,非零 ID 优先。更换设备后重新选择方法,按签名填写参数数组,再从源端回读。 |
| 目标特殊方法 | TargetName 或准确的 TargetId 定位转发目标,非零 ID 优先。上传方法分别填写 Topic 和字节载荷;其他方法按其参数定义填写。 |
| 写入业务结果 | 变量 RPC 的 Result 描述写入成功、内容或错误,应与真实目标值核对。 |
| 节点执行事件 | ExecutionResult 供执行观察和错误处理使用;成功事件也可传到接收端,不能把它直接当成业务写入值。 |
状态输出默认只在值变化时向下游传播,事件端口则可在相同载荷下再次触发。检查重复动作时,同时看当前输入、执行身份和下游反馈,避免仅凭布尔输出不变就判断未执行。控制规则应明确使用持续状态还是上升沿/下降沿,防止一次变化造成不需要的重复写入。
带回差的风机控制
以下流程可在隔离的协议仿真工程中练习。先准备可读写温度变量 Temperature 和布尔线圈 Fan,让风机从关闭状态开始。完整点位和上下游配置见完整项目配置与交付。
- 新建并暂时禁用流程,添加“变量通知规则”,只监听温度变量。
- 添加“JSON 数值提取”和“阈值触发”,把通知值连接到数值提取,再把数值连接到阈值输入。
- 阈值触发填写
Threshold=75、Hysteresis=5、CompareOperator=>。 - 添加变量 RPC,设备和变量选择实际风机线圈,把阈值的
Triggered输出连接到WriteData。 - 保存并启用,依次改变温度,逐次核对节点状态、写入结果与源端线圈。
| 温度与操作顺序 | 预期控制状态 |
|---|---|
从关闭状态升到 85 | 超过进入界限 80,开启。 |
再降到 75 | 位于回差区,保持开启。 |
再降到 65 | 越过退出界限 70,关闭。 |
再回到 75 | 保持关闭,直到再次超过进入界限。 |
回差向中心阈值两侧展开,不是把 75 当作固定开关点。比较符为严格 > 时,关闭状态输入恰好 80 不进入,开启状态输入恰好 70 会退出;若业务要求不同,应明确选择比较符并测试相等边界。流程重载会重新建立节点状态,上线时也应检查启动状态和第一次通知。
结束练习时先禁用流程,再恢复温度和风机初始状态。现场控制还应核对通信质量、变量写权限和执行机构反馈,单次 RPC 成功不等于执行机构已经动作。
常见流程设计
| 场景 | 设计方式 |
|---|---|
| 单一路径处理 | 触发节点或输入节点 → 处理节点 → 输出节点。 |
| 分支处理 | 一个处理节点连接多个下游节点,同时执行报警判断、数据记录或消息推送。 |
| 多条件综合判断 | 多个输入或处理节点连接到同一个判断节点,由判断节点输出结果。 |
| 周期任务 | 使用定时器类节点触发周期计算或周期推送。 |
| 外部推送 | 使用 Webhook、MQTT、邮件等数据推送节点,将处理结果发送到外部系统。 |
| 循环关系 | 避免让节点形成闭环连接。需要状态记忆时,优先使用保持、计数器、内存变量或专门处理节点。 |
使用与排障
故障处理
| 现象 | 处理建议 |
|---|---|
| 保存失败 | 检查流程名称是否为空、节点参数是否有效,并查看页面错误提示。 |
| 节点找不到 | 确认自定义节点已编译成功,再刷新页面。 |
| 流程不执行 | 检查流程是否启用、触发节点是否收到数据、连线方向是否正确。 |
| 节点参数为空 | 选中节点,检查输入参数、输入输出参数和默认值。 |
| 结果不符合预期 | 查看节点实时参数值,从上游到下游逐段定位。 |
| 日志为空 | 确认流程已启用并实际触发,再检查日志级别和时间范围。 |
| 系统负载升高 | 检查高频触发、复杂计算、外部推送和“无限制触发”配置。 |
| 导入规则包后节点异常 | 检查 JSON 包的依赖清单、节点端口和脱敏配置;先部署并编译所需自定义节点,校验通过后再启用。 |
| 端口无法连接 | 确认连接方向和参数类型匹配,避免输出端口连接输出端口或输入端口连接输入端口。 |
| 实时参数值不显示 | 确认流程已启用并触发运行;未运行的流程不会产生节点实时值。 |
| 日志持续报错 | 打开日志详情查看异常信息,再回到对应节点检查参数、脚本和外部连接。 |
| Webhook HTTP 200 但执行为业务拒绝 | 查看本次执行错误码和厂商 errcode/errmsg;HTTP 成功不代表钉钉或企业微信接受了消息。 |
| Webhook 平台配置错误 | 钉钉选 DingTalk,企业微信选 WeCom,普通接口选 Custom;企业微信和自定义平台必须清空 Secret。 |
| Webhook 频繁限流 | 在推送前增加边沿、阈值、定时或聚合节点,控制同一机器人或消息推送每分钟不超过 20 条。 |