# 触发器

> 触发器编辑器：标识与位置、带种类、间隔和动作的“计划”卡片、“调度情况”竖栏、每 100 毫秒的调度器及其固定延时和跳过的节拍、那些命令，以及触发器做不到什么。

触发器把一个起因绑到一个[动作](logic-actions)上。今天唯一的起因种类是**定时间隔**：调度器按一个固定周期把绑上的那个动作发出去。在 Logic 那一栏 Triggers 一节下面选中一个触发器，或者在它所在文件夹或所属那一节的根的表格里按它那一行上的**打开**，就能打开它的编辑器（用“新建…”>“新建触发器”造出来的触发器不会被打开，而是在那张表格里突出显示，见[新建与复制](logic#creating-and-copying)）；读要**查看 Logic**，编辑要**配置 Logic**。触发器上没有操作类命令：它自己会发，而手工跑一次是那个动作自己的“运行”。

标题栏显示触发器标记、名称、那一行“一个自行运行某个动作的计划，按你设定的间隔执行。”，触发器关着的时候还有一枚**已禁用**的胶囊。表单那一列里放着**标识**和**计划**；右边那条竖栏放着**调度情况**。

## 标识 {#identity}

| 字段 | 它是什么 | 取值 / 默认值 | 影响 |
| --- | --- | --- | --- |
| 名称 | 显示名称；这个触发器发出去的那些运行都记在它名下。 | 自由文本；新触发器叫 `TriggerN`；名字留空则存成 `Trigger`。 | 每一次按键都自动保存。触发器是按身份被引用的；重命名不影响别的任何东西。 |
| 位置行 | 这个触发器归在哪里：`Triggers / <folder> / <name>`。 | 只读。 | 触发器没有地址。要改文件夹就用树里的**移动到**。 |
| 说明（可选） | 自由文本。 | 空。 | 没有影响。 |

## 计划 {#schedule}

| 字段 | 它是什么 | 取值 / 默认值 | 影响 |
| --- | --- | --- | --- |
| 种类 | 起因。 | 定时间隔，唯一的一种。 | 今天没有影响。 |
| 间隔（毫秒） | 发出的周期。 | 一个至少为 100 的整数（调度器扫查的分辨率）；默认 1000。 | 更小的、负的或者解析不了的输入会保留已存的间隔，并显示“间隔必须是不小于 100 ms 的整数（调度器的分辨率）。”改了间隔会把时钟重置：下一个节拍在下一次扫查之后整整一个新间隔才到点。 |
| 动作 | 这个触发器发出去的那个动作。 | `(none)` 或者本工作站的任何一个动作；默认 `(none)`。 | 没有动作的触发器空转，并写“请绑定一个动作。在此之前触发器一直空转。”；动作被删掉的写“绑定的动作已经不存在。请另选一个。”；动作被禁用的写“绑定的动作‘X’已禁用，因此触发器空转。” |

每个字段都自动保存；卡片下面那条校验提示每半秒重算一次。

## 调度情况 {#scheduling}

调度器每 100 毫秒扫查一次，把到点的东西发到动作通道上，也就是动作脚本跑的那条顺序通道，和表达式与报警那每 100 毫秒的扫描周期是分开的：

- 刚创建、刚启用，或者刚改过间隔、种类或动作的触发器，会在下一次扫查时被起表：它的第一个节拍在那之后一个间隔到点。
- 发出去之后，下一个节拍从**此刻**起整整一个间隔才到点（固定延时）：忙过一阵之后绝不会有一串补发。
- 一个到点时该触发器上一次运行还排着队或者还在执行的节拍会被**跳过，而不是排队**；这次跳过被计数，下一个节拍重新排程。一个慢动作后面攒不出积压。
- 动作缺失或已禁用的触发器空转：它被重新排程但不发出，而空转从不算作一次跳过。
- 这次运行记在触发器的名字下面，它的结果落在那个动作的**最近一次运行**竖栏里。已禁用的触发器从不发出。

**调度情况**那条竖栏显示实时诊断：**上次触发**、**下次到期**（调度器起表之前是一道短横）、**跳过的节拍**（一个只存在内存里的计数，重启之后回到 0），以及那句提示“上一次运行还没结束就到来的节拍会被跳过，不会排队（不积压）。只有失败的运行才会进入事件控制台，记在这个触发器的名下。”

Triggers 根的面板在“数值”那一列里列出每一个触发器和它的状态：“每 1000 毫秒 · 上次 `<when>` · 跳过 N 次”，或者“已禁用”。

## 命令 {#commands}

| 命令 | 作用 | 何时置灰 | 何时不画出来 |
| --- | --- | --- | --- |
| 启用 / 禁用 | 翻转“已启用”；启用会把时钟重新起表。 | 工作站被锁住或只读。 | 角色没有“配置 Logic”。 |
| 复制 | 把这个触发器（同一个动作、同一个间隔）复制到 Triggers 根下面一个空闲的名字上，它不会被打开，而是在这个根的表格里突出显示（见[新建与复制](logic#creating-and-copying)）；副本一开始没有排程。 | 工作站被锁住或只读。 | 角色没有“配置 Logic”。 |
| 删除触发器 | 先问“要删除‘X’吗？这会把这个触发器拿掉。 此操作无法撤销。” | 工作站被锁住或只读。 | 角色没有“配置 Logic”。 |

删掉绑上的那个动作，会让触发器变成没有绑定，而不是跟着动作一起被删掉。

## 触发器不做什么 {#what-triggers-do-not-do}

没有别的起因种类：没有东西是由一次数值变化、一个条件、一天里的某个时刻或者开机来触发的。一个触发器只发一个动作，绝不发好几个，也绝不手工发出：要手工跑就跑那个动作本身。调度器随运行时一起停下，而工作站正在关闭时被“运行时已停止”拒绝的一次发出会被静静丢掉。
