# 单元

> 一个模型落实到哪些工位上：模型页面上的单元表格、添加和移除一个单元、在各个定义屏幕上选中的那个单元、操作下面的单元，以及全部启动和全部停止。

一个**单元**就是一个模型落实到的一台工位。每一个单元都把模型的整份定义跑一遍，接的是它自己的信号源：它的通道绑定到点位或变量上，它用自己的代号盖下模型的元数据，它跟随或者覆盖模型在联锁、产量和打印机上的默认设置。往试验台上加一台工位，就是加一个单元。

一个单元有意在两个地方出现。在**模型自己那一页**上，它是**单元**表格里的一行：这个单元是什么，和它的兄弟并排声明（需要管理 Process）。在模型的**操作**分组下面，它是在用的那个单元：是否有一次运行占着它，以及操作它所用的那些操作面板和仪表画面（打开它需要查看模型；启动任何东西需要运行流程）。

## 模型页面上的单元表格 {#the-units-table-on-the-models-page}

**单元**卡片立在模型页面上标识和结构之间，上面那行写着“这个模型实际落地的那些工位。每一个都运行模型的全部定义，接到各自的信号源上。”它只对管理 Process 画出来：不能编辑结构的角色看不到它，就像它也看不到定义一样。

这张卡片是一个列表，旁边是选中单元自己的面板（两者之间的分隔条可以拖动）。列表：

| 列 | 显示什么 |
| --- | --- |
| **名称** | 单元的名称，可以就地编辑（一次安全重命名，见下）。 |
| **代号** | 稳定的短代号，可以就地编辑；占位文字写“无”。 |
| **通道** | 这个单元接到什么程度了，按模型来读：“还没有通道”“已绑定 5 条，没有缺失”或者“已绑定 4 条，缺失 1 条”（最后一种用警示色）。 |
| （行上的动作） | **删除单元**，用危险色。 |

点一行就在右边的**单元**栏里打开它。什么都没选中时，这一栏写着“选中一个单元，它就会在这里打开。”，模型一个单元都没有时则写“这个模型还没有单元。添加一个，它就会在这里打开。”

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **名称** | “这个单元的每一个地址所对应的那个名称。”：也就是 `Process.<Model>.<Unit>` 里属于这个单元的那一段。 | 自由文本；创建时是“单元 1”“单元 2”……。字母和数字原样进入地址，其余一律变成 `_`，开头是数字时前面补一个 `_`。 | 提交（回车，或者离开该字段）是一次协调的重命名：预告行说出有多少处位置读这个地址，提交则把它们改写。名称的地址段和这个模型的另一个单元映射到同一个时会被拒绝：“名称‘X’映射到的地址段‘Y’已经被‘Z’占用。”没有管理 Process 时，以及工作站被锁住时，它是禁用的。 |
| **代号** | “一个稳定的短代号，包含它的流水号元数据用它来盖章。重命名单元绝不会改变它。” | 自由文本，去掉首尾空格；空着就是没有。 | 每一个组成里带**单元代号**部件的流水号字段都会把它印出来，而一次会提示这种字段的启动，在单元代号空着时会被拒绝。同一个字段在[元数据](process-metadata)屏幕上也能编辑，就在那些用它来盖章的计数器旁边。 |
| **附注** | “在这张试验台上干活的人应该知道的任何事情。除了人，没有别的东西读它。” | 任意文本；默认为空。 | 无。 |

单元按添加进来的先后排列；没有控件可以给它们重新排序。

## 添加一个单元 {#adding-a-unit}

单元卡片标题上的**单元**添一个；模型那一行右键菜单里的**添加单元**也一样。两者都需要管理 Process，工作站被锁住时都变灰。单元生下来叫第一个空着的“单元 N”（N 是模型里还没有哪个单元用这个名字的最小编号，所以第一个单元重命名之后，N 又是 1），在列表里被选中、面板打开并滚动到可见处，因此给它起名是你做的第一件事。

新单元还什么都没绑（在一个有六条通道的模型上，它的覆盖情况读作“已绑定 0 条，缺失 6 条”），没有自动化，联锁信号、产量周期和数量、打印队列都跟随模型。它的绑定在[通道](process-channels)上做；它的代号和计数器在[元数据](process-metadata)上读。

## 移除一个单元 {#removing-a-unit}

**删除单元**骑在它所结束的那一行上，因此走掉的是指针下面那一行，绝不是表格碰巧选中的那一行。它先确认：“要删除‘X’吗？这会删除这个单元和配置在它上面的一切。 此操作无法撤销。”

工作站在操作记录条上拒绝时会说“单元正忙于一次运行操作时无法删除。”和“单元的联锁处于锁定状态时无法删除。”；保存本身也同样拒绝，说“单元‘X’正忙或者联锁处于锁定状态时无法移除。”被移除的单元把它的绑定、自动化、自己的数量和自己的打印机槽位一并带走。它已记录的运行仍留在历史里，它们的文件也没有被动过。只有被选中的那一行离开时才会把那一栏留空，而且要等它真的走了才会。

一个单元不能从操作里移除：结束一台工位是结构上的事，它住在声明这台工位的地方。

## 整个模型只选中一个单元 {#one-picked-unit-across-the-model}

选中哪个单元，对整个模型只有一个答案：模型页面上的单元表格和五个[定义](process-definition)屏幕各自的单元列表，读写的是同一次选择。从通道走到打印机，你仍然站在手上的那张试验台前。点中某个屏幕定义那一半里的一行（一条通道、一个字段、外部停止那一行、一个数量、一个打印机槽位），会把选中的单元清掉，因为每一个屏幕只标记一行。在你点一行之前什么都没选中，而一条把你送到通道或自动化的[验证](validation)发现，到达时出问题的那个单元已经选好了。这次选择是按窗口算的，而且不保存。

## 操作下面的单元 {#the-unit-under-operate}

选中模型的**操作**分组，会按操作员见到的样子打开那些单元，上面写着“这个模型运行在哪些工位上。打开一个即可预选流程、启动它，并观看一次带记录、有判定的运行。”：一个单元一张卡片，带着它的实时状态，优先次序如下：

| 状态行 | 含义 |
| --- | --- |
| **停止信号已触发** / **等待复位** / **停止信号不可用** | 这个单元的停止联锁，只有模型的外部停止启用时才读（见[自动化](process-automation)）。 |
| **记录中** / **已暂停** / **保存中** / **准备中** / **收尾中** | 有一次运行操作占着这个单元。 |
| **空闲 · 保温试验** / **空闲 · 未预选流程** | 没有东西占着它；有流程预选时，这一行写出那个流程的名字。 |

一个单元都没有时，这面墙写着“还没有单元。请在模型自己的页面上，在‘单元’表里添加一个。”

选中一个单元会打开它自己的页面：标题“这个模型运行的一个工位。打开一个界面即可预选流程、启动它并观看这次运行。”，有运行占着单元时带一枚写着运行状态的小药丸（记录中、已暂停、保存中、准备中、收尾中；一个设为等待的配方段还欠着设定值时则是“正在等待设定值抵达设备”，这时那一行标题让位给“仍在等待：Furnace, Pump 1”，也就是还没有被各自的现场设备收下的那些通道），以及一张**界面**卡片，“操作这个单元所用的东西：它的模型定义的操作面板和仪表画面，为这个单元画出来。点一个即可打开。”，这个模型的每一张操作面板、每一张仪表画面各一个方块。这里不编辑任何配置好的东西，页面也不带命令栏：预选、启动和观看一次运行发生在那些界面上，写在[操作](process-operate)那一页里。

## 全部启动和全部停止 {#start-all-and-stop-all}

操作分组的命令栏上带着这个模型的两个批量触发。它们只对运行流程画出来。

| 命令 | 做什么 | 什么时候变灰 |
| --- | --- | --- |
| **全部启动** | “启动每一个已预选流程且当前可以运行的单元。其余的跳过。”一个单元能启动，要求没有东西占着它、运行时接受操作、它的联锁没有挡住它，而且它上面预选了流程。 | 这个模型此刻没有单元能启动；已经有一批在跑；运行时已停止。 |
| **全部停止** | “停止每一个正在运行的单元。已经停止的仍然停止。” | 没有单元在运行；已经有一批在跑；运行时已停止。 |

批量执行期间，是否够格是一个单元一个单元重新读的，因此被同一批里更早那次启动弄得不够格的单元（例如共用了一个写入信号源）会被跳过。没有同步，没有共享的预选，也没有回滚：一个单元的拒绝只记入日志，绝不会停下或回退另一个。操作记录条报出“已启动 3 个单元。”“已停止 1 个单元。”或者“没有单元可以启动。”这一批启动的每一次运行都记下同一个责任人：在这个窗口上登录的用户，没有人登录时则是工作站。

## 按单元跟随模型的三件事 {#what-follows-the-model-per-unit}

单元要回答的三件事配置在模型上，除非单元自己不一样，否则继承下来。在各自的屏幕上，被选中的单元会显示一个二选一，“跟随模型的默认设置”或者“有自己的……”，旁边是眼下生效的配置：跟随时是模型自己的值，只读；一旦脱开，就是这个单元自己的值。

| 事项 | 屏幕 | 脱开时拿什么做起点 |
| --- | --- | --- |
| 停止联锁的信号和极性 | [自动化](process-automation) | 单元从来没有指定过自己的信号时，用模型的信号和极性。 |
| 滚动周期和那些命名数量 | [产量](process-productivity) | 单元没有自己的数量时，用模型的周期和它那些数量的副本。 |
| 四个打印队列 | [打印机](process-printers) | 单元自己那四个全是空的时候，用模型的四个队列。 |

重新跟随模型不会抹掉单元原有的任何东西，因此第二次脱开时它们又都回来了。

## 这一页不做的事 {#what-this-page-does-not-do}

- 一个单元没有属于它自己的通道、操作面板或仪表画面：那些是模型的，只是为这个单元绘制出来。
- 单元不能复制；要复制就复制模型。
- 单元不能在模型之间移动，它的名称也不从树里编辑。
- 全部启动和全部停止是触发，不是一次协调的运行：没有谁会等谁。
