主题
9.5 多个触发条件与与或非
一条流程可以放多个触发条件,再用「与 / 或 / 非」把多路条件组合起来。 这一节讲清楚它们是怎么算的,以及几个最容易接错的地方。
9.5.1 一次触发 = 把流程扫一遍
服务器的算法和 PLC 梯形图扫描很像:
任意一个触发条件成立,就以"这次是它触发的"为前提,把整张流程图算一遍。
- 一次扫描里,只有把流程叫起来的那个触发条件是"成立",其它触发条件都算"不成立"。
- 每个中间节点的值由它输入端连进来的线算出来。
- 输出节点像线圈:只要有一条输入线送来"成立",就执行动作。
- 本次触发条件顺着连线走不到的节点,一律算不成立,不会掺进这次结果里。
所以「多个触发条件」的含义是多个入口,不是"它们要同时成立",也不是默认的"或"关系。 真正的组合关系由您连的与 / 或 / 非决定。
9.5.2 多个入口,同一套动作
最常见的用法:几个不同的情况都要发同一条通知(图中 ①)。
水位变化时扫一遍:水位那个触发条件成立 → 「或」成立 → 发邮件。 温度变化时同理。两条线互不影响。
只是多个入口的话,「或」可以省掉
把两个触发条件直接连到同一个输出节点也一样:输出节点本身就是"任一输入成立就动作"。 用「或」的好处是后面还能再接「与」「非」继续组合。
9.5.3 用「与」要求同时满足
「与」组合的应该是状态判断,不是触发条件本身。
正确写法:A 变化时,并且 B 当前值超过阈值,才发邮件(图中 ②)
两条线都从同一个触发条件出来:一条直接进「与」,另一条经过「数值比较」读水泵状态的当前值再进「与」。 水位变化时,只有水泵也在运行才发邮件。
两个触发条件不能直接连到「与」上(编译会报错)
见图中 ③。触发条件表示"这一刻发生了这件事",一次扫描只会有一个成立, 要求两个同时成立等于永远不满足。点「编译」会直接报错。
想表达"水位变了,而且温度也高",正确做法是把温度改成「数值比较」读温度点位的当前值。
9.5.4 用「非」表示"不满足"
「非」用来给判断结果取反(图中 ⑤):定时启动 → 数值比较(水泵状态 == 1)→ 非 → 发送邮件。
意思是"每 10 分钟检查一次,水泵不在运行状态就发邮件"。
触发条件不能直接取反(编译会报错)
见图中 ④。在"水位变化"这次扫描里它恒为成立,取反后恒为不成立,这条线永远走不下去。 点「编译」会直接报错。
9.5.5 「数值比较」的两个出口
「数值比较」有满足 / 不满足两个出口。多数「取反」的需求用「不满足」出口即可实现,不必再加「非」节点,见图中最后一组。
9.5.6 编译会自动拦截的错误
点顶部「编译」(保存时也会自动查一遍),下面这些会报错,必须改:
| 情况 | 原因 |
|---|---|
| 缺少触发条件 / 缺少输出动作 | 流程没有入口或没有动作 |
| 两个以上触发条件直接连到「与」 | 一次只有一个触发条件成立,永远不满足 |
| 触发条件直接连到「非」 | 触发那一刻恒成立,取反后恒不成立 |
| 「与」「或」「非」没有输入连线 | 算不出结果,永远不成立 |
| 流程里有环 | 节点连成了闭环 |
| 必填参数为空 | 如没选数据点、没填收件人 |
下面这些是警告,可以保存,但最好看一眼:
| 情况 | 说明 |
|---|---|
| 「与」「或」只连了一个输入 | 等于直通,没起到组合作用 |
| 同一个点位配了多个「数据变化」触发条件 | 一次变化会扫多遍,输出会重复执行(发两封邮件)。值变大 + 值变小 这一对互斥,不算重复 |
| 同一台设备配了多个「设备离线」触发条件 | 掉一次线会重复触发 |
| 参数完全相同的多个「定时启动」 | 到点会同时扫多遍 |
| 某个触发条件往下走不到任何输出 | 它触发时不会产生动作,等于白配 |
| 某个节点没有输出连线 | 算出来的结果没人用 |
多个触发条件时用了 $trigger.* | 它取的是本次触发的那个条件的值;要固定某个点位请直接填点位名 |
9.5.7 用「测试运行」验证
多触发流程建议先用「测试运行」看一遍。它会逐个触发条件各演练一遍, 每条前面标的是节点编号,后面是这个节点算出来是成立还是不成立、以及为什么:
===== 假设由触发条件「水位变化」触发 =====
本次由它触发
856 > 300 成立
或:有输入成立
输出:out.email
[演练] 将发送邮件(测试运行不真发)
===== 假设由触发条件「温度变化」触发 =====
本次由它触发
25 > 60 不成立
或:所有输入都不成立
上游条件不成立,不动作
[演练] 该触发条件本次不会产生任何动作绿色是成立、红色是不成立,点位取的是当前实时值。邮件和短信只演练不真发,可以放心点。
哪个触发条件配了却"不会产生任何动作",这里一眼就能看出来。