# 流程

> 操作员在一个单元上启动的东西：这次运行的时间窗口、它组合起来的配方、数据记录、别名集和判定、它提示填写的字段、它投入的事件条目、它发出的动作，以及一次完成的运行产出什么。

一个**流程**就是操作员在某个单元上启动的东西：一个运行外壳（方式，时序运行还有它的时长和循环次数），加上一些指向这个模型设定各个库的可选引用。它的页面读起来就是它所组合出来的那次运行，发生一件事就是一段，每一段都写明当前的选择产出什么（“执行 3 个循环，每个 1 分 30 秒”“每 500 ms 记录 6 个通道”）；什么都没选的那一段仍然看得见，只是淡下去，因为一次运行做什么这个形状，也包含它不做什么。流程住在 Process > 模型 > 某个模型 > 设定 > **流程**下面，需要**编辑配方与判定**权限。预选和启动一个流程发生在操作下面那个单元的行上（见[运行记录与备注](process-runs)）。

## 流程文件夹 {#the-procedures-folder}

选中**流程**那一行会打开文件夹页面（“操作员在单元上启动的东西：要套用的配方、用来判的判定、要记录的数据记录，以及要采集的元数据。”），一个流程一张卡片，按名称排；点一张卡片就打开它，那个叉则把它删掉。一个都没有时，页面写着“还没有流程。添加一个。”

| 命令 | 做什么 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| **新建流程**（选中文件夹时在详情栏上；右键**添加流程**） | 添一个 `流程 <n>`：即时，什么都不引用，只提示那些必填字段，什么都不投入、什么都不发出，也不计入产出。它被加进所属的分组，在那里突出显示并滚动到可见处；用它的卡片打开它。 | 任何一个单元上有运行，或者运行时已停止。 | 没有编辑配方与判定时。 |

## 流程的页面 {#the-procedures-page}

标题栏带着名称、那一行“操作员在单元上启动的东西：一次运行记录拿到的时间窗口、它套用、记录、命名和判定所用的那些模型库，以及它产出什么。”、一枚写着方式的小药丸，时序流程还带一枚写着时长和循环次数的小药丸（“90000 ms ×3”）。这份组合通不过验证时，标题下面一条警示附注说明原因（见下面的验证）；草稿照样保存。每一个字段都自动保存，被工作站拒绝的写入会把字段放回去。

### 定义 {#definition}

| 字段 | 是什么 | 取值 / 默认 |
| --- | --- | --- |
| **名称** | 这个流程在树里、在每一个单元的流程选择框里，以及在运行记录文件里叫什么。给它重命名绝不改变它的代号。 | 自由文本；创建时是 `流程 <n>`。 |
| **附注** | 给读它的人看的自由文本。 | 多行；默认为空。 |

### 一次运行记录做什么 {#what-a-run-does}

五段，每一段带着它所伸手去取的那个库的图标、它的名称、当前选择的结果写成一行，以及决定这个结果的那些字段。结果那一行里的数字（不到一分钟的时长里的秒数、采样点个数）都用工作站的数字格式写（[语言与格式](settings-localization)）。

| 段 | 字段 | 取值 / 默认 | 结果那一行 |
| --- | --- | --- | --- |
| **窗口** | **方式**：这次运行的外壳。 | **即时**（默认）：一次成型，套用、记录一行、判一次。**时序**：一个有界的时间窗口，可以重复。**受控**：不设终点，由启动和停止划界。 | 即时：“套用、记录并判定一次，然后结束。”受控：“一直执行，直到操作员停止它。” |
| | **时长（ms）\***（只有时序才有）：这个窗口的长度。 | 一个毫秒数；填负数按 0 存。时序方式下必填且必须为正。这次运行的每一个成员共用这一个窗口。 | “执行 1 分 30 秒。”，或者“请设置一个时长：长度为零的时间窗口什么也记不下来。” |
| | **循环次数**（只有时序才有）：这个窗口重复多少次，作为一份连续的运行档案。 | 1 或更大（填小于 1 的按 1 存）；默认 1。判定按每个循环重新锚定，不通过的循环会被数出来。 | “执行 3 个循环，每个 1 分 30 秒，合计 4 分 30 秒。” |
| **套用** | **配方**：套用哪一份[配方](process-recipes)。 | “（无）”或者这个模型的一份配方。类型和这个方式不合的配方列作“`<name>`（不兼容）”并被禁用，理由写在悬停提示里（“时序方式需要一个时序配方。即时的一组设定值没有时间轴。”或者“`<方式>`方式需要一个即时配方。时序曲线没有单一的时刻。”）。一份时序配方会在这一段下面画出它的曲线，用的是配方页面画预览的那同一套。 | “不写入任何设定值。”“开始时写入 4 个设定值。”“开始时写入 4 个设定值，收尾时再写入 2 个。”“用 2 分 30 秒走完 3 个曲线段，并在收尾时写入 2 个设定值。” |
| **记录** | **数据记录**：记录哪一份[数据记录](process-datalogs)。 | “（无）”或者这个模型的一份数据记录。 | “什么也不记录：这次运行记录不留下数据记录。”“每 500 ms 记录 6 个通道。”，时序窗口还加上“……，每个通道约 540 个采样点。” |
| **名称** | **别名集**：锁定到这个流程上的那个[别名集](process-aliases)。 | “（无）”或者这个模型的一个别名集。这个流程在某个单元上被预选、而该单元的别名和这一套不一样时，这一套就应用到那个单元上；冻结进运行记录的别名是那个单元自己的。 | “单元保留它原有的通道名称。”“这个流程在某个单元上被预选时，给该单元的 5 条通道重命名。” |
| **判定** | **判定**：这次运行按哪一份[判定](process-evaluations)来判。 | “（无）”或者这个模型的一份判定。 | “不给出结论：运行记录跑完但不作判定。”“判定 4 条判据，重大 级的不合格会中止运行记录。”“判定 4 条判据，不合格也不会中止运行记录。” |
| | **不合格达到以下程度即中止**（选了判定之后才画出来）：在第一条达到或超过这个严重程度、并被确认的不合格判据上结束这次运行。在循环运行上，这就是那个“停还是继续”的控制：设了门限，就在第一个达到或超过它而不通过的循环上结束整场试验；选**（从不）**，就跑完每一个循环，只把不通过的数出来。 | **（从不）**（默认）、**轻微**、**重大**、**严重**。 | 折进上面那行判定的话里。 |

### 元数据 {#metadata}

一张卡片，标题上是一枚数出“开始时提示填写”多少项的小药丸，里面装着一次运行要问什么，以及为它那些流水号字段服务的两样东西。

| 控件 | 是什么 | 取值 / 默认 |
| --- | --- | --- |
| 清单 | 这个模型[元数据目录](process-metadata)里每一个字段一个复选框，按目录顺序排，标着 `<name>（<kind>）`，必填字段则是 `<name> *（<kind>）`。 | 必填字段被勾上并锁住（“必填字段每个流程都会提示填写”）；其余的一开始没勾。勾上一个，就把它加进启动提示和一张操作面板的元数据卡片所问的东西里。目录里一个字段都没有时，卡片写着“目录里还没有字段。请在模型的‘元数据’下添加。” |
| **流程代号** | 那些把“流程代号”算在内的流水号字段所用的那个稳定代号（“每一个含有‘流程代号’并被提示填写的流水号字段都读它。”）。给流程重命名绝不改变它。 | 自由文本，离开字段时提交；占位写“用到之前可以不填”。 |
| **计数器**（某个被提示的流水号字段按流程或按流程加单元计数时才画出来） | 这类字段每一个一行：按流程计数的，一行，标着“这个流程”；按流程加单元计数的，这个模型每个单元一行。每一行显示**上一个发出的**和一个可编辑的**下一个**，而“下一个”不高于上一个发出的值时，它警告“可能重复出同一个标识”。 | “下一个”接受 0 到这个字段的最大值；超出的会被拒绝，写着“‘`<field>`’的下一个值必须在 0 到 `<max>` 之间。”行下面那句帮助：“‘上一个’绝不会被改写。调低‘下一个’或者到达最大值后回绕，都可能重复出同一个标识。” |

### 这个流程期间投入的事件条目 {#occurrences-armed-during-this-procedure}

一枚小药丸数出投入了多少个事件条目，清单则按名称提供这个模型的每一个[事件条目](process-occurrences)。被勾上的事件条目在这个流程的运行期间，在记录下来的那些行上判；投入时机为**始终**的事件条目不管勾不勾都在监视。这个模型里一个都没有时，卡片写着“这个模型里还没有事件条目。请在模型的‘事件条目’下添加。”

### 这个流程产出的动作 {#actions-this-procedure-emits}

一枚小药丸数出选中了多少个动作，清单则按列表顺序提供这个模型的每一个[动作](process-actions)，每一个带着它的产出那一行（“开始时的标签，完成时的标签和报告”），选中之后还有一枚**就绪**或**待复核**小药丸。待复核会把这个流程为了那个动作的标记而缺的东西列出来（一个它不提示的元数据字段、一条它的判定没有声明的判据、一个它不跑的循环），每一条都配上补救办法。产出顺序和这张卡片其余的部分写在[动作](process-actions#how-a-procedure-selects-actions)那一页上。

### 生产产出 {#production-output}

最后那张卡片，标题上是一枚**计入**或**不计入**小药丸，声明一次完成的运行给这个单元的生产指标贡献什么（见[产量](process-productivity)）。

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **产出单位** | 产出的物理单位。 | 自由文本，离开字段时提交；占位写“件、kg……”；默认为空。在计入产出期间这个字段不能被清空：填空会被忽略。 | 在每一项指标上给那个数量命名。 |
| **产出时机** | 一次运行的哪一个边界算作产出。 | **不计入产出**（默认）、**每完成一次运行记录**、**每完成一个循环**、**每完成一次运行记录固定数量**。产出单位没设之前，计数的那几种方式都被禁用（“请先设定物理产出单位。”）；循环那一种在时序方式之外被禁用（“只有时序流程才有‘完成一个循环’这回事。”）；而当某个生效的命名产量项把这个流程合计在内时，“不计入产出”被禁用（“请先在‘产量’页面上，把这个流程从那些命名的产量项里移出去。”）：包括这个模型自己的产量项，以及那些已经脱开的单元的产量项。一个已经回去跟随模型的单元仍然保留它原有的那些产量项，而在它再次脱开之前它们什么也不计。 | 图例：“运行记录走到哪一个界点才算产出，达到它又计入多少。”效果：“每完成一次运行记录产出 1 件。快照和‘判定’从不计入。”“每完成一个循环产出 1 件。……”“每完成一次运行记录产出 25 kg。……”，或者“这个流程不计入产出。”选一种计数方式会把数量重新设回 1。效果里的数量用工作站的数字格式写，有几位小数就写几位，最多六位。 |
| **每次完成的产量**（固定数量方式） | 一次完成的运行贡献的批量数量。 | 一个正数；默认 1。 | |
| **参考速率**（计入产出期间） | 目标产出速率（“按历时来衡量，包含暂停和重启在内。”）。 | 一个正数或者留空；默认为空。没有它，数量和实际速率照样算得出来，只是没有产能达成的百分比。 | |
| **参考周期**（计入产出期间） | 参考速率的时间基准（“各项指标会把它折算成每小时的产出。”）。 | **每小时**（默认）、**每天**。 | |

被中止和失败的运行以数量为零封存它们的产出记录。已经完成的循环，即使后来某个循环把包着它的那次运行中止了，仍然算数。

## 验证 {#validation}

标题下面那条警示附注，也就是启动所强制的那道门，写的是下面之一：

- “没有可执行的内容：这个流程既没有引用数据记录，也没有引用配方。”
- “判定要在记录下来的数据行上做。这个流程带了一条判定，却没有数据记录。”
- “时序方式需要一个时长。请设定一个。”
- “即时方式需要一个即时配方，或者不用配方。时序曲线没有单一的时刻。”
- “受控方式需要一个即时配方，或者不用配方。设定值在启动时写下，安全状态在停止时写下。”
- “时序方式需要一个时序配方，或者不用配方。即时的一组设定值没有时间轴。”
- “配方曲线（*N* ms）比时间窗口（*M* ms）长。”
- “流程‘*名称*’只有在时序方式下才能计完成的循环。”“流程‘*名称*’的产出数量必须是有限的正数。”“流程‘*名称*’按次计的产出，每完成一次只能计一个单位。”“流程‘*名称*’缺少产出的计量单位。”
- 对于一个已启用、已投入、但条件通不过验证的事件条目：“事件条目‘*名称*’不成立：…”
- “事件条目‘*名称*’监视‘Channels.*通道*’，而这个流程的数据记录不记它。”事件条目是在记录下来的那些列上判的，因此监视一条数据记录漏掉的通道，只会在整次运行里把信号标成不可用。
- “事件条目‘*名称*’监视记录下来的采样点。这个流程把它布防了，却没有数据记录。”

删掉一个被引用的库条目只是让这个流程降级，而不是把它弄坏：那处引用清空，那一段就写出没有它之后它做什么。

## 删除流程 {#remove-procedure}

**删除流程**在选中这个流程时立在详情栏的危险组里，也在它的右键菜单里，还是文件夹页面卡片上那个叉。它先问一次（“删除流程”，“这会把这个流程从模型里删掉。”）。这个流程还会从产量页面上每一个把它合计在内的命名产量项里退出，模型那一级和每个单元那一级都退；而一个来源都不剩的产量项也跟着走。它需要编辑配方与判定，在工程锁定和运行时停止之下变灰。这个流程已记录的运行仍留在历史里。

## 一个流程不做的事 {#what-a-procedure-does-not-do}

- 它不在这里启动任何东西。一个单元在[操作](process-operate)下面它自己的行上预选并启动它，或者通过那个选中它的自动化来启动（见[自动化与停止联锁](process-automation)）。
- 它不装任何按单元的东西：每一个单元都在它自己的绑定上跑同一份组合。
- 它不给它的动作或事件条目排序；顺序是模型的。
- 它不带自己的模板：一次运行打印或发布什么，那是某个动作的事。
