# 动作

> 一次运行在开始时或完成时发出的、命名好的标签、报告、Logic 动作和数据库行的包，它们的命令、一张标签的标记映射、一条数据库行的列，以及一个流程怎么选中它们。

一个**动作**是一次运行发出的、命名好的一包文书：它里面每一次产出一条**命令**，每一条都写明出来的是什么（一张标签、一份报告、运行一个 Logic 动作，还是工厂数据库里的一行）、什么时候出（开始时还是完成时）、用工作站库里的哪个模板、哪个 Logic 动作或者哪张数据库表，以及在完成时针对哪些结论。一个流程选中的是整个动作，因此写一次的一包文书就服务于每一个发出它的流程，而改一条命令是改一处，不是每个流程改一遍。动作住在 Process > 模型 > 某个模型 > 设定 > **动作**下面。创建它们、删除它们，以及编辑一个动作的名称、它的命令和它们的映射，全都由同一项**编辑配方与判定**权限把关，页面上也这样写着（“更改动作需要‘编辑配方与判定’权限。”）。

## 动作文件夹 {#the-actions-folder}

选中**动作**那一行打开的页面和设定里其他文件夹不一样：是这个模型的动作列表，旁边是列表里被点中的那一个，因为一个动作要对着它的兄弟来读。列表的顺序就是每一个流程发出这些动作的顺序，因此行上的那些动作挪的是一个动作，绝不是一条命令。这一页会把两个工作站库（标签模板和报告版式）载进来判断就绪程度；其中一个载不进来时，会有一条提示条写着“无法载入全局标签模板：…”或者“无法载入全局报告：…”。

| 列 | 显示什么 |
| --- | --- |
| **#** | 这个动作在列表里的位置。 |
| **名称** | 可以就地编辑，离开单元格时提交。空名称会被拒绝，写着“动作必须有一个用于操作的名称。” |
| **命令** | 有多少条命令，然后是它们产出什么：“0 · 还没有”，或者“2 · 开始时的标签，完成时的标签和报告”，Logic 动作命令则写作“完成时运行 1 个 Logic 动作”（或者“开始时运行 2 个 Logic 动作”）。数据库行命令则写作“完成时写入 1 个数据库行”（或者“开始时写入 2 个数据库行”）。悬停提示把它们一行一条列出来，写作 `完成时的标签 · <template>`，Logic 动作命令带上动作的名称，还没选时写“没有 Logic 动作”，数据库行命令写作 `通过 <device> 写入 <table>`，还没选表时写“没有表”。 |
| **状态** | **就绪**，或者在这个动作或它任何一条命令还缺什么时写**待复核**。 |
| 行上的动作 | **把动作上移**、**把动作下移**、**删除动作**（危险色；问“删除动作”：“这会删除这个动作及其命令。”）。 |

列表旁边那一栏的标题是**动作**，它显示被点中动作的**名称**（这里也能编辑）、它那些**命令**作为只读的行，每一行带一枚就绪 / 待复核小药丸（“这些命令按这个顺序，在列里这个动作自己的页面上编辑。”），以及一条**需要复核**提示条，把缺的东西全部列出来。一个动作都没有时，列表写着“没有动作。当这个模型的某个流程应该出标签或报告、运行 Logic 动作或写入数据库行时，添加一个。”；什么都没点中时，那一栏写着“选中一个动作，看它产出什么。它的命令在列里它自己的页面上编辑。”

| 命令 | 做什么 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| **新建动作**（选中文件夹时在详情栏上；右键**添加动作**） | 在列表末尾添一个空的 `动作 <n>`（这个模型还没有动作用过的第一个号），并在那一栏里点中它，滚动到可见处。 | 任何一个单元上有运行，或者运行时已停止。 | 没有编辑配方与判定时。 |
| 上移 / 下移 / 删除动作（行上的动作） | 重新排序或者删除。 | 没有管理 Process 时、工程锁定之下，或者运行时停止期间（按下去会在操作记录条上报出原因）。 | 一直画出来。 |

## 动作的页面 {#the-actions-page}

在树里选中一个动作就打开它：标题栏带着动作的名称和一枚数出它命令条数的小药丸，然后是权限和库的那些提示条，一张带**名称**字段的**动作**卡片（失焦时提交；空的被拒绝），以及**命令**列表，旁边是列表里被点中的那一条命令。

| 命令 | 做什么 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| **新建命令**（选中动作时在详情栏上；右键**添加命令**） | 在列表末尾添一条命令，它生下来是一张**完成**时为**合格**运行出的**标签**，还没有模板，并在那一栏里点中它，滚动到可见处。 | 任何一个单元上有运行，或者运行时已停止。 | 没有编辑配方与判定时。 |
| **删除动作**（危险组；右键；文件夹页面卡片上那个叉） | 在“删除动作”之后删掉这个动作和它的那些命令。每一个选中过它的流程都不再发出它。 | 同上。 | 没有编辑配方与判定时。 |

### 命令列表 {#the-commands-list}

| 列 | 显示什么 |
| --- | --- |
| **#** | 这条命令在这个动作里的位置，也就是它在这个动作内部的产出顺序。 |
| **产出内容** | **标签**、**报告**、**Logic 动作**或者**数据库行**。 |
| **触发时机** | **开始**或者**完成**。 |
| **模板或动作** | 一个跨四份清单的选择框：标签那一行提供那些标签模板（“（请选择模板）”），报告那一行提供那些报告版式（“（请选择报告）”），Logic 动作那一行提供工作站的 Logic 动作（“（请选择 Logic 动作）”），每个都放在 Logic 树归档它的那些文件夹下面，已禁用的标成“`<name>`（已禁用）”，数据库行那一行提供 Connector 的 Database 设备（“（请选择 Database 设备）”）。清单里已经没有的引用仍然占着它的位置，处于禁用状态，写作“模板缺失 · `<id>`”“报告缺失 · `<id>`”“Logic 动作缺失 · `<id>`”或者“设备缺失 · `<id>`”，这样一条降级了的命令就不会读起来像一条还没配置的命令。 |
| **结论** | 开始时的命令写“开始时用不到”；否则写勾选的那些结论（“合格、不合格”）或者“一个也没选”。 |
| **标记** | “报告用不到”“Logic 动作用不到”；对标签则是：“没有模板”“模板缺失”“没有指令”（这个模板还没有打印机指令）“无法读取”“固定，没有标记”，或者“`<total>` 个中已绑定 `<bound>` 个”；对数据库行则数有值的列：“没有表”或者“`<total>` 列中有 `<n>` 列”。 |
| **状态** | **就绪**或者**待复核**。 |
| 行上的动作 | **把命令上移**、**把命令下移**、**删除命令**（“删除命令”：“这会把这条命令从动作里删掉。”）。 |

一条命令都没有时，列表写着“没有命令。当这个动作应该出标签或出报告时，添加一条。”；什么都没点中时，那一栏写着“选中一条命令，就能在一个地方编辑它的全部内容。当这个动作应该出标签或出报告时，从上面的命令栏添加一条。”

### 一条命令的全貌 {#the-command-in-full}

那一栏打开被点中的那条命令，标题是 `命令 <n> · <触发时机> 时的<种类>`。它只显示所选种类拥有的那些字段。

| 字段 | 是什么 | 取值 / 默认 | 效果（字段下面那一行） |
| --- | --- | --- | --- |
| **产出内容** | 这条命令拿出什么。 | 标签 / 报告 / Logic 动作 / 数据库行；创建时是标签。 | “用一个指令模板打印一张标签，打印队列由单元在这个时机为标签选定。”“用工作站库里的一份报告发布这次运行记录的 PDF。”“在动作通道上运行工作站的一个 Logic 动作。”或者“通过 Connector 的一台 Database 设备，向工厂数据库的一张表添加一行。”改动种类，会把结论筛选重新落到新种类的默认值上（标签：合格；报告、Logic 动作和数据库行：全部结论）。 |
| **触发时机** | 它在运行的哪一个时点出来。 | 开始 / 完成；创建时是完成。 | 开始时的标签：“在运行记录开始的那一刻生成，那时还没有任何结果。”；完成时的标签：“在运行记录结束时生成，针对下面勾选的最终结论。”；开始时的报告：“在运行记录开始的那一刻发布，因此还什么都没记录的那些节会被略去。”；完成时的报告：“在运行记录结束时发布，针对下面勾选的最终结论。”；开始时的 Logic 动作：“运行记录开始时即进入队列。运行记录不会等它。”；完成时的 Logic 动作：“在运行记录保存之后运行，针对下面勾选的最终结论，并通过 LastRun 读取刚结束的运行记录。”；开始时的数据库行：“运行记录开始时写入，用它固定下来的元数据。运行记录不会等数据库。”；完成时的数据库行：“在运行记录保存之后写入，针对下面勾选的最终结论，用刚结束的运行记录。运行记录不会等数据库。” |
| **Logic 动作**（Logic 动作命令） | 这条命令运行的、工作站 Logic 里的那个动作。 | “（请选择 Logic 动作）”或者一个动作；创建时没有。 | 图例：“这条命令运行的 Logic 动作。它按标识引用，所以重命名动作后这里仍然指向它。”效果：“请选一个动作：选好之前，这条命令什么也不运行。”“引用的 Logic 动作已不存在：这条命令什么也不运行。”“在动作通道上运行 `<action>`。”或者“`<action>` 已禁用：这条命令每次触发时，动作都会拒绝运行并记录原因。” |
| **报告**（报告命令） | 用工作站库里的哪一个版式来发布这份 PDF。 | “（请选择报告）”或者一个版式；创建时没有。 | “不发布 PDF。”“引用的报告不在库里。”“运行记录开始时发布一份 PDF。” / “……运行记录结束时……”，打开了打印时还加上“并把它送到这条命令在单元上的打印队列。” |
| **报告打印：自动打印**（版式解析出来之后才显示） | 已发布的 PDF 是否也送到这个触发时机下该单元的报告队列。 | 创建时关。 | 图例：“无论如何，PDF 都会在运行记录走到这条命令时发布。打印与否只决定它是否还会送进队列。”开：“PDF 还会送到这条命令在该单元上的打印队列。请在“打印机”页面上选定那个队列。”关：“PDF 发布到报告文件夹，不再往下走。” |
| **报告副本：把它留在运行记录里**（版式解析出来之后才显示） | 排好的 PDF 是否存进运行记录文件里，这样在版式被编辑或删除之后，一次重发送出的仍然是那些字节。 | 创建时关。 | 图例：“这次运行记录保留文档的哪一部分，日后重新发送时提交的也是它。”开：“每次运行记录都带着做好的 PDF，几百 KB，重新发送时提交的正是这份文档。”关：“每次运行记录只指向已发布的 PDF，因此重新发送时提交的是日后重新渲染出来的那一份。” |
| **全局模板**（标签命令） | 这条命令打印工作站库里的哪一个标签模板，下面绑定的也是它的标记。 | “（请选择模板）”或者一个模板；创建时没有。选中一个，会为这个模板声明、而这条命令还没有映射的每一个标记创建出一行映射。 | “选一个模板：它的标记就是这条命令要填的东西。”“引用的模板已不在库里。”“这个模板还没有打印机指令，因此没有可发送的东西。”“无法读取这个模板的标记。”“没有标记：每一次匹配的运行记录都发送相同的字节。打印队列由单元选定。”，或者“`<n>` 个标记，每一个都在下面绑定到为这次运行记录冻结的一个值上。打印队列由单元选定。” |
| **对哪些最终结论产出**（只有完成时才有） | 哪些最终结论会让这条命令生效。 | 四个复选框：**合格**、**不合格**、**无法判定**、**没有结论**。标签一开始只勾合格；报告一开始四个全勾，因为一个什么都不判的流程以没有结论收尾，而它照样必须出它的文档；Logic 动作也一样，因为送往另一个系统的运行记录不能在没人说明的情况下漏掉一件不合格品（脚本自己就能读结论）。 | 只有当一次运行以某个勾选的结论收尾时，这条命令才发出。开始时的命令还没有结论，因此它不读任何筛选。 |

字段下面有一条**需要复核**提示条，把这条命令还缺的东西全部列出来（见下面的就绪程度）。

一份打印出来的文档送到哪个队列，不是这条命令的字段：它是按这条命令的种类和触发时机、通过该单元那四个打印机槽位解析出来的，因此同一种组合的两条命令是有意共用打印机的。见[打印机](process-printers)。Logic 动作命令什么都不打印，也没有槽位。

### Logic 动作命令 {#logic-action-commands}

Logic 动作命令是一次运行留给为工作站编程的人的挂钩：在一个边界上，它运行一个 [Logic](logic-actions) 动作，这个动作可以经任何驱动把这次运行送到另一个系统、点亮一盏灯或者把一个计数器清零。动作按标识来选，所以在 Logic 页面上重命名它，这里什么都不变；它自己的编辑器会在**使用者**卡片里列出这条命令。

| 方面 | 开始时 | 完成时 |
| --- | --- | --- |
| 什么时候运行 | 运行记录一开始就进入动作通道的队列，排在同一时机的标签和报告之前。 | 运行记录保存完毕、单元的 [LastRun](process-addresses#lastrun) 已经装着它之后。 |
| 运行记录等什么 | 什么都不等：不管动作慢、被拒绝还是失败，运行记录都照常往下走。 | 什么都不等：运行记录已经结束了。 |
| 哪些运行记录触发它 | 每一次开始的运行记录。 | 每一次以某个勾选结论收尾的运行记录，失败的运行记录除外，它什么都不触发。 |
| 动作从运行记录里读什么 | `Procedure.Metadata.<Field>`，正在开始的这次运行记录冻结的值。 | `LastRun.*`：这次运行记录的标识、状态、结论、时刻、元数据和每条判据的结果。 |

同一时机的几条 Logic 动作命令一条接一条地运行，按下面的产出顺序，哪一条都不会因为前面那条还在运行而被跳过：每一次运行记录都有它自己的那一次。一次运行记录对动作做了什么，要在动作的页面上看：它的**最近一次运行**竖栏把这次运行记录记作 `Process · <unit> · <action>`，有错误和被拒绝的写入时一并列出，诊断日志也会保留它们；运行记录文件里什么都不写。命令配置好之后被删掉的动作会被跳过，并在诊断日志里留下一条警告；已禁用的动作拒绝运行并记录原因。

### 数据库行命令 {#database-row-commands}

一条**数据库行**命令向工厂数据库的一张表添加一行，也就是 MES 已经在维护的那张追溯表：零件的序列号、结论和测量值，用那张表已有的列名写入。这一行经过 Connector 页面上 [Database](driver-database) 驱动的一台设备，连接和登录都由那台设备保存，所以命令不指定任何服务器，也不保存任何密码。表是已经存在的：工作站从不建表也不改表，只往里添加行。

| 字段 | 它是什么 | 取值 / 默认 | 效果（字段下面那一行） |
| --- | --- | --- | --- |
| **Database 设备** | 这一行经过的设备。 | “（请选择 Database 设备）”或者 Connector 的一台 Database 设备；创建时没有。 | 说明：“这一行经过的 Connector 的 Database 设备。连接和登录都由它保存，所以这里什么也不用输入。”效果：“请选一台设备：选好之前，这条命令什么也不写入。”“引用的设备已不存在：这条命令什么也不写入。”或者“通过 `<device>` 写入。” |
| **数据库表** | 这一行要添加到的表。 | “（请选择表）”或者设备所在数据库的一张表，在命令打开期间经过设备读取：只列基本表，连接默认不读的架构会带上架构名。数据库不再列出的表仍然占着它的位置，处于禁用状态，写作“`<table>`（不在数据库中）”。 | 说明：“这一行要添加到的表。它已经存在于数据库中：工作站从不建表。”效果：选好之前是“请选一张表：它的列从数据库读取。”选一张表就会读取它的列。 |

读取表的时候，选择框下面那一行写着“正在读取数据库的表……”；读不出来时会说原因（“无法读取 `<device>` 的表：`<cause>`”），表超过 500 张的数据库会说“数据库中的表比列表显示的多：只列出前 500 张。”一条数据库行和报告一样，创建时针对全部最终结论。

字段下面的**表的列**按表里的顺序，每一列列一行，每一行带着数据库写出的类型；在表会拒绝这一列没有值的行的地方（这一列不接受空值、没有默认值，也不是标识列、自增列或计算列），标上**表中必填**。每一列都选一个**数值**；交给数据库的列不出现在这一行里，所以数据库会用它自己的默认值来填。

| 数值 | 开始时 | 完成时 | 以什么形式发送 |
| --- | --- | --- | --- |
| （交给数据库） | 是 | 是 | 不发送：这一列不出现在这一行里 |
| 固定文本，写在**要写入的文本**里 | 是 | 是 | 文本，每一行都一样 |
| 元数据 · 目录字段，用**目录元数据**选 | 是 | 是 | 文本：运行记录为这个字段固定下来的值 |
| 运行记录 · 标识、流程 · 名称、单元 · 名称、单元 · 代号、运行记录 · 最终状态、运行记录 · 结论 | 否 | 是 | 文本（`Completed` 或 `Aborted`；`Ok`、`Nok`、`Indeterminate` 或 `None`） |
| 运行记录 · 开始于、运行记录 · 结束于 | 否 | 是 | 日期和时间，用工作站的本地时间 |
| 运行记录 · 时长（秒） | 否 | 是 | 数字 |
| 运行记录 · 循环数、运行记录 · NOK 循环数 | 否 | 是 | 整数 |
| 判据 · 结果、判据 · 限值，用**判据**选 | 否 | 是 | 文本 |
| 判据 · 通过 | 否 | 是 | 真或假 |
| 判据 · 测量值、判据 · 最小值、判据 · 最大值、判据 · 最大越限 | 否 | 是 | 数字 |
| 判据 · NOK 循环数 | 否 | 是 | 整数 |

完成时的值就是单元的 [LastRun](process-addresses#lastrun) 提供给 Logic 的那些值，判据是在判过它的每一个循环上合并起来的值；运行记录没有要求填写的字段，以及没有判过的判据，不给出值（NULL）。列表抬头的**重新读取列**会从数据库重新读取表的列：一列保留给它的值，新的一列不带值进入列表，表里已经没有的一列从列表里移除。

| 方面 | 开始时 | 完成时 |
| --- | --- | --- |
| 这一行什么时候发出 | 运行记录一开始，用运行记录固定下来的元数据。 | 运行记录保存好、单元的 LastRun 有了它之后。 |
| 运行记录等什么 | 什么也不等：这一行在设备自己的队列里等，运行记录继续往下走。 | 什么也不等：运行记录已经结束。 |
| 哪些运行记录写它 | 每一次开始的运行记录。 | 每一次以勾选的结论结束的运行记录，以失败结束的除外，它什么也不写。 |

这一行是一条 INSERT，只写有值的列，每个值都作为它自己类型的参数发送，从不写成语句里的文本，所以带引号或 SQL 词语的序列号也会按它本来的文本保存。数据库把每个值转换成它那一列的类型，就像转换任何值一样。拒绝这一行、在驱动的 10 秒内没有回答或者连不上的数据库，只会提醒：运行记录不受影响，诊断日志记下这次拒绝，运行记录把这一行连同拒绝和原因留在[历史](histories-documents#database-rows)的**数据库行**档案里。不会留着以后再发；那里的**重新发送**会手动发送同样的值。同一时点的几条数据库行按下面的产出顺序一条接一条发出。

一条数据库行命令缺的东西会进入下面“就绪程度”的清单，按修复的顺序排列：“请选择一台 Database 设备。”“它指定的 Database 设备已不存在。”“它指定的设备 `<device>` 不是 Database 设备。”“请选择一张表。”“请至少给一列赋值：没有列的行不会写入。”“`<column>` 是表要求必填的列，但没有值。”“`<column>`：这个值在开始时还不存在；那时只有元数据字段或固定文本。”“`<column>`：请从这个模型的元数据目录里选一个字段。”和“`<column>`：请从这个模型的某个判定里选一条判据。”只有数据库才能说出的事，会在这个页面上打开命令期间读取，并进入同一份清单：“表 `<table>` 已不在数据库中。”“`<column>` 已不是这张表的列。请重新读取列。”“这张表有这条命令还没读到的列：`<columns>`。请重新读取列。”和“无法从数据库读取这张表：`<cause>`”。选中这个动作的流程会说出它对某一列缺了什么：“列 `<column>` 读取了一个这个流程不会提示填写的元数据字段。请在上面的“元数据”里勾选它。”“列 `<column>` 读取了一条判据的结果，而这个流程不按任何判定来判。”或者“列 `<column>` 读取了一条这个流程的判定没有声明的判据。”

### 标记 {#markers}

标记就是一个标签模板留给这次运行去填的那些 `{{NAME}}` 字段，因此这一节只为标签命令画出来，别的都不画。它的状态跟着模板走：

| 状态 | 这一节显示什么 |
| --- | --- |
| 没有选模板 | “先选一个模板，才能映射它的标记。”如果还留着更早那个模板的映射：“模板缺失期间，已保存的映射仍然保留。”并写出那些标记的名字。 |
| 模板已经不在库里 | “模板不可用”，配上同样那份保留下来的清单。 |
| 模板没有打印机指令 | 一条提示条：“‘`<template>`’还没有打印机指令：在‘模板 ▸ 标签’下写入或导入之前，没有可发送的东西，也没有可映射的标记。” |
| 标记读不出来 | 一条提示条“无法读取‘`<template>`’的标记：`<error>`”，以及“已保存的映射得以保留。更改这些绑定之前，请先修复或替换这个模板。” |
| 模板没有标记 | “固定模板。这个模板没有标记，对每一次匹配的运行记录都发送相同的字节。” |
| 找到了标记 | 一个标记一行，标题是那个标记和一枚**已映射** / **必填**小药丸，下面是那些字段。 |

| 字段 | 是什么 | 取值 / 默认 |
| --- | --- | --- |
| **冻结值来源** | 代进这个标记里的那一个运行值。 | “（未映射）”再加上下面那张表里的那些来源。开始时的命令只列出开始时就能取到的来源；完成时的命令把它们全列出来。“元数据 · 目录字段”只有在这个模型的元数据目录里有字段时才出现，而那些判据来源只有在这个模型的某份判定声明了判据时才出现。当前触发时机答不上来的来源仍然占着它的位置，处于禁用状态，写作“…（这条命令用不到）”。改动来源会把上一个来源所选的字段、循环和格式设置清掉。 |
| **目录元数据**（元数据来源） | 这个模型目录里的哪一个字段。 | “（请选择目录元数据）”，已经不在的字段写“字段缺失 · `<id>`”，然后是每一个字段，写作“`<name>` · 文本 / 数字 / 流水号”。 |
| **判据**（判据来源） | 这个模型哪一份判定里的哪一条判据。 | “（请选择判据）”“判据缺失 · `<id>`”，然后是每一条判据，写作“`<evaluation>` · `<判据名或判据 n>` · `<channel>`”。 |
| **循环（从 0 开始）**（判据来源） | 哪一个循环的结果。绝不隐含：必须输入。 | 0 到这个模型任何一个流程所跑的最大循环数减一；占位写“必填”。超出这个范围的数字会在字段下面被拒绝。 |
| **数值格式**（日期和时间来源） | 那个时刻怎么写出来。 | 按记录原样（默认）、工作站日期、工作站时间、工作站日期和时间、ISO 8601 格式。 |
| **小数位**（数值来源，以及数值型的元数据字段） | 固定的小数位数。 | 0 到 9；占位写“自动”（工作站自己的偏好）。 |
| **清除无效的格式设置** | 一个按钮，当某个映射带着它的来源用不了的格式设置时才画出来（日期上带小数位、数字上带日期格式、文本上两者带其一）。 | 把那个出格的字段重置。 |

那些来源，按选择框列出它们的顺序：

| 来源 | 开始时可用吗 | 种类 |
| --- | --- | --- |
| 元数据 · 目录字段 | 可以 | 文本，数值字段则是数字 |
| 模型 · 名称、模型 · 修订、单元 · 名称、单元 · 代号、流程 · 名称、流程 · 代号、运行记录 · 标识 | 可以 | 文本 |
| 运行记录 · 开始于 | 可以 | 日期和时间 |
| 运行记录 · 状态（开始时）/ 运行记录 · 最终状态（完成时） | 可以 | 文本 |
| 运行记录 · 结束于 | 不可以 | 日期和时间 |
| 运行记录 · 时长（秒） | 不可以 | 数字 |
| 运行记录 · 结论、运行记录 · 结束原因 | 不可以 | 文本 |
| 判据 · 名称、通道、限值、严重程度、结果、错误、受影响的通道 | 不可以 | 文本 |
| 判据 · 窗口开始于、窗口关闭于 | 不可以 | 日期和时间 |
| 判据 · 已判的采样点、超限的采样点、不可用的采样点、无效的采样点、最大越限 | 不可以 | 数字 |

标记那些行下面，**已移除的标记**列出为当前模板已经不再声明的标记所存下来的那些映射（“`<n>` 个失效”；“这些映射在选中的模板里已经不存在，必须删掉。”），每一个都配一个**删除失效的标记映射**。

### 就绪程度 {#readiness}

两页上的就绪 / 待复核小药丸，以及验证页面列出来的那些行，来自同一次判断。没有命令的动作缺一条命令：“请添加一条命令：这个动作目前不产生任何输出。”一条命令缺什么，按修理它们的顺序：

- “请至少选择一个完成结论。”（完成时的命令一个结论都没有勾选）
- “请选择一份报告。” / “选中的报告已不存在。”
- “请选择一个 Logic 动作。” / “它指定的 Logic 动作已不存在。” / “它指定的 Logic 动作已禁用，所以每次触发都会被拒绝。”
- “请选择一个标签模板。” / “模板已被清除或删除；已保存的映射仍然保留。” / “选中的全局模板已不存在。”
- “选中的模板还没有打印机指令；请在运行记录走到这条命令之前写入或导入。”
- “无法读取模板标记：`<error>`”
- “{{M}} 需要一个信号源。” / “{{M}} 被映射了不止一次。”
- “{{M}}：请选择一个信号源”“这个信号源在开始时还取不到”“请从这个模型的元数据目录里选一个字段”“请从这个模型的某个判定里选一条判据”“请明确指定一个从 0 到 `<n>` 的循环序号”“请去掉这个日期时间信号源上的小数位”“请对这个数值信号源使用默认格式”“小数位必须在 0 到 9 之间”“请去掉这个文本信号源上的数值或日期格式”
- “{{M}} 已从当前模板中移除；请删掉它保存的映射。”

处于待复核的命令照样跑：产出时什么都不会被丢掉，而一个解析不出来的标记，还是和一向那样让那一张标签失败。配置屏幕才是知道这件事的地方，不是打出来的那张标签。

## 一个流程怎么选中动作 {#how-a-procedure-selects-actions}

一个流程的页面上带着**这个流程产出的动作**卡片，配一枚“已选 `<n>` 个”的小药丸，以及这个模型每一个动作一个复选框，按列表顺序排。每一行都显示这个动作的产出那一行（“开始时的标签，完成时的标签和报告”，或者“目前不产生任何输出：这个动作还没有命令。”），选中之后还有一枚**就绪**或**待复核**小药丸。待复核会把这个流程为了那个动作的标记而缺的东西列出来，一个标记一条说明，因为一个按运行解析的标记，只有在这个流程手里有它所指的那样东西时才解析得出来：

- “{{M}} 读取了一个这个流程不会提示填写的元数据字段。请在上面的“元数据”里勾选它。”
- “{{M}} 读取了一条判据的结果，而这个流程不按任何判定来判。”
- “{{M}} 读取了一条这个流程的判定没有声明的判据。”
- “{{M}} 读取第 `<c>` 个循环，而这个流程只跑一个循环。” / “……只跑 `<n>` 个。”
- “它指定的 Logic 动作已不存在。”（这个动作里的一条 Logic 动作命令，它指定的动作已被删除：流程在它的位置上什么都不会运行）

这个动作既不被藏起来也不被拒绝：流程说出它缺什么，而补救就在同一页上。这个模型里一个动作都没有时，卡片写着“这个模型里还没有动作。请在模型的“动作”下添加。”

### 产出顺序 {#the-emission-order}

在一次运行的边界上，被选中的那些动作按模型列表的顺序产出，每个动作内部按它的命令顺序产出，并按那个边界的触发时机筛选：整个模型只有一个答案，绝不是每个流程一个。开始时的命令在这次运行成形之后（在流水号元数据被占用之后）跑，完成时的命令在最终结论封存之后跑。每一条命令都是隔离的：一次失败什么都不发布，不改变这次运行的任何东西，也绝不拦住它后面的命令。一份报告按这次运行和发出它的那个动作来命名；同一条命令后来的一次重排，只替换那条命令的那份文档，别的都不换。Logic 动作命令在它那个时机的 Logic 动作命令之间保持这个顺序；它什么时候运行，写在 [Logic 动作命令](#logic-action-commands)里。每一次产出在这次运行里记下什么、以及它在历史里怎么被重出，写在[发出标签和报告](process-emission)那一页上。

## 一个动作不做的事 {#what-an-action-does-not-do}

- 它自己什么都不发出。必须有一个流程选中它，而且那个流程的一次运行必须走到那个边界。
- 它不检查流程。某个流程是否提示某个标记所指名的字段、是否按它所指名的判定来判，写在流程自己那一页上，就在选择的旁边。
- 它不挑打印机。队列是单元的，按种类和触发时机来定，在[打印机](process-printers)上。
- 它不编辑模板。标签的打印命令和报告版式在[模板](process-templates)下面写；动作只是指名它们。
- 它不确认真的打印出来了。队列接受了，就是一张标签或者一份打印出来的报告所记下的全部，绝不是纸真的出来了的证明。
- 它不等 Logic 动作，也不把它记进运行记录。动作的结果在 Logic 里它自己的页面上，以及诊断日志里。
- 它不建表也不改表，也不把被拒绝的行留着以后再发。一条数据库行写进工厂数据库里已经有的表；拒绝会记在运行记录里，并在历史里手动重新发送。
