# 操作面板

> 一个模型的那些操作面板：每个单元都照着它运行的那组固定卡片，在模型上排一次，以及一张操作面板怎么到达“操作”和 View 页面。

**操作面板**是一个模型的一个有名字的操作界面：一组固定的卡片，在模型上排一次，为它的每一个单元画得一模一样。它不是仪表画面：它上面不会打开编辑器，画布上不拼任何东西，而一个单元由之运行的那个界面，在每一台工作站上都相同、都完整。操作面板住在 Process > 模型 > 某个模型 > 可视化 > **操作面板**下面。排布一张需要**管理 Process** 权限；在一个单元上操作那些卡片需要**运行流程**权限。

## 操作面板文件夹 {#the-panels-folder}

选中**操作面板**那一行会打开这个文件夹的页面（“定义在这个模型上的操作面板。每一个对所有单元都有效，每一个自己决定 View 页面是否承载它。”），每张操作面板一个方块；点一个方块就打开它，方块上那个叉把它删掉。这个文件夹永远不空：一个还没有声明过操作面板的模型，读起来就是唯一一张名叫 **Overview** 的操作面板，画出整份卡片目录，而在它上面做的第一次改动，才把它作为模型的一行存下来。

| 命令 | 做什么 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| **新建操作面板**（选中文件夹时在详情栏上；右键：**添加操作面板**） | 在这个模型已有的那些操作面板旁边创建一张名叫 `操作面板 <n>` 的操作面板。它被加进所属的分组，在那里突出显示并滚动到可见处；用它的卡片打开它。一个仍然读作默认的模型，会先把 **Overview** 存下来，这样新建的这一张是立在它的单元本来就在操作的那个界面旁边，而不是把它顶替掉。 | 任何一个单元上有运行，或者运行时已停止。 | 没有管理 Process 时。 |

## 操作面板的页面 {#the-panels-page}

选中一张操作面板会打开它的排布：标题栏（“这个模型的一个操作面板：它画哪些卡片，以及按什么顺序画。模型的每一个单元都带着它。”）、一张**标识**卡片，以及排布本身。每一次改动都自动保存；工作站拒绝掉的一次写入，会把这一页原封不动地退回改动之前。

### 标识 {#identity}

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **名称** | 这张操作面板在树上那一行、在“操作”下面每个单元的行上，以及在它的 View 页面条目上叫什么。 | 自由文本；空白会被拒绝，仍保留原来的名称。创建时是 `操作面板 <n>`，默认的那一张是 `Overview`。 | 重命名每一个称呼它的行。 |
| **图标** | 画在树上那一行操作面板名称左边、以及每个单元 View 页面条目上的那个标记。 | 一个显示当前标记的按钮（或者写着“图标”二字，或者在图标库里没有这个名称时写出存下来的名称）。按下它，会在卡片下面展开图标库的网格，带一个**按名称或关键词搜索**字段（“用英文：oven、pump、water”）；第一格是**无图标**。选一个标记就应用它并收起网格；在网格外面按一下或者再按一下这个按钮也会收起，而搜索文字会留到下一次。默认没有图标。 | 操作面板存的是这个标记在库里的名称，绝不是码位。库里没有的名称，会在两处行上都画出固定的操作面板标记，因此树和 View 页面绝不会各说各的。 |

### 这个操作面板 {#the-panel}

这张卡片自己说明了自己：“这个界面按绘制顺序排列。关掉一张卡片就把它略去，也可以把它移到该在的位置。仪表画面卡片就是编辑器画出来的那张空画面；其他卡片则用示例读数填充。单元没有东西可给的卡片会被跳过，而不是画成空白。”

它下面每张卡片一行，顺序就是每个单元绘制它们的顺序。每一行就是那张卡片本身，摆着示例读数，这样排布就没法承诺一副单元并不会画出来的样子：一个名叫 `Sample` 的单元、预选着这个模型的第一个流程、状态“运行中”、循环“2 / 5”、一条备注、一段已经结束的事件条目发生记录、这个模型可读通道的五分钟走势，以及一份产量台账：这个模型的每个产量项一行（没有声明产量项时，每个计入产出的流程一行），合格率由它自己的合格与不合格计数算出。示例只提供一个正在运行的单元会提供的东西；其余的（流程、元数据字段、通道、各个库）都是这个模型自己的，因此某样东西一个也没声明的模型，看到的就是这张卡片自己的空。整个预览都是死的：里面什么都按不动。

| 一行上的控件 | 做什么 |
| --- | --- |
| 那个复选框，标着卡片的名称，后面跟着卡片的说明 | 把这张卡片算进来（开）或者略去它（关）。无论开关，这一行都留在列表里，关掉时变暗。 |
| **在页面上的高度（px）**（只有仪表画面行才有） | 这张仪表画面在页面上立多高：120 到 1200，默认 320；超出范围的值会在字段下面被拒绝。“仪表画面会缩放以填满这个方框；滚动的是页面，不是仪表画面”。这一行关掉时它被禁用。 |
| **把这张卡片上移** / **把这张卡片下移** | 把这一行挪一个位置。第一行不能再上，最后一行不能再下；箭头用一直变灰来说明这一点。 |

模型的停机联锁启用时，有固定的一行立在最前面，排在每一张卡片之前：**联锁**，“这个单元观测的外部停止信号，以及复位它的办法。单元正常时它什么也不画，所以这里也没有可展示的。”，标着**始终**。它是这个界面的安全背景，不是一张卡片，永远不会被排掉（见[自动化与停机联锁](process-automation#the-interlock-card-of-the-picked-unit)）。

把每一张卡片都关掉是一张合法的操作面板，这一页也说明了它意味着什么：“每一张卡片都关掉了，因此每个单元在这个操作面板上只会这么说一句，没有任何可操作的东西。运行记录仍然可以从这个模型的另一个面板，或者从一张仪表画面上启动。”

## 卡片目录 {#the-card-catalogue}

在一张什么都没排过的操作面板上，目录里的卡片按这个顺序立着。每一张都是为打开这个面板的那个单元画的，而工作站没有东西可给的卡片会被略去，而不是画成空白。

| 卡片 | 在一个单元上展示什么 | 你在它上面能做什么 | 什么时候被略去 |
| --- | --- | --- | --- |
| **运行记录** | 卡片的头上带一盏灯，说出这个单元此刻在做什么：没有运行记录占着它时是**未在记录**，否则是**准备中**、**记录中**、**正在等待设定值抵达设备**、**已暂停**、**保存中**或者**收尾中**，每一种都在[运行记录与备注](process-runs#the-run-card)里说明。一个**流程**选择器（“（无）”加上这个模型按名称列出的那些流程）预选下一次启动。随后是生命周期按钮，顺序是：**启动**（重点色）、**暂停**、**继续**、**停止**、**中止**，各带自己的悬停提示（“在这个单元上启动预选的流程”“冻结时间窗口；数据记录继续记录”“解除暂停，让窗口继续走”“干净地结束这次运行记录，并把它冻结成历史”“以中止方式结束这次运行记录；收尾块仍然执行”）。 | 预选一个流程，按下此刻就绪的那条命令；每一个按钮都自己读自己的就绪状态。只有预选的流程是时序流程时（或者什么都没预选时）才画出暂停和继续，因为只有时序窗口才冻结得住。被拒绝的命令会在卡片上说出来，写在一条注意提示里；这台工作站或者这个单元不接受运行操作的那些理由（运行时已停止、单元被自己的联锁扣住），写在它下面。 | 永不。 |
| **元数据** | “‘`<procedure>`’的下一次运行记录以什么身份记录下来。带 * 的字段每个流程都会提示填写。”预选的流程提示填写的每一个元数据字段一项，按目录顺序排列。流水号字段不是一个输入框：它显示计数器会拼出什么的预测，附带提示“计数器在启动时才确定最终值，因此共享的计数器在那之前可能还会往前走。”，或者在什么都预测不出来时写“开始时已预留”。什么都没预选时：“预选一个流程，它提示填写的字段就会出现在这里。” | 输入下一次启动要用到的值。预选是全工作站范围的，因此在这里输入的值，就是这个单元的其他每一个界面看到的值。 | 预选的流程一个字段都不提示时。 |
| **运行状态** | 三个读数：**状态**（这次运行记录的状态，或者在一次运行正被受理时写**准备中**，或者写**空闲**）、**循环**（“2 / 5”，或者**不循环**）、**结论**（正在进行的这次运行记录的结论，或者最近一次证据的结论，或者**无**；没有运行记录占着单元时，名字是**上次运行记录的结论**）。 | 读。 | 永不；只有循环这一个读数会在预选的流程是即时流程或受控流程时被略去。 |
| **备注** | 这次运行记录的备注时间线，头上写着“备注 · `<run>`”“备注 · 没有正在进行的运行记录”或者“备注（不可用）”。 | 通过时间线下面那个输入框给进行中的运行记录添加一条备注（运行流程）。见[运行记录与备注](process-runs#the-comments-card)。 | 永不。 |
| **事件条目** | 这个单元的事件条目发生记录，活动的排在前面，头上写着“事件条目”“事件条目 · `<n>` 条活动”或者“事件条目 · 运行记录之外”（一次刷新失败时写“· 已过期”）。 | 读。 | 永不。 |
| **通道** | 这个单元的可读通道画在一张实时图上，每条系列用这个单元上生效的那个名称命名，用它的通道所声明的颜色和分组画出来，带着应用里每一张图都有的那条图表工具栏（见[图表](view-charts)）。 | 缩放、平移、保存或复制这幅图、开关系列。 | 模型一条可读通道都没声明时。 |
| **产量** | 这个单元在“今天”和滚动周期上产出的数量、速率、合格率和结论台账。见[产量](process-productivity)。 | 读。 | 永不。 |
| **单条命令** | “在流程之外，对这个单元单独发出一条命令。”三行，每一行只有在模型声明了它所依据的那个库时才画出来：**快照**（一个数据记录选择器加**采集**：“立即记录一行数据记录，作为一次已完成的运行记录存入历史”）、**立即判定**（一个数据记录选择器、一个判定选择器加**判定**：“立即拍一行快照，并按判定来判它”）、**套用配方**（一个覆盖这个模型即时配方的选择器加**套用**：“把配方的设定值经出口写一次（不记录运行记录）”）。 | 发出这条命令；结果落在操作记录条上（“快照已记录。请看‘历史’。”“已判定。结论记在‘历史’里。”“配方已套用。”）。采集和判定需要运行流程权限、一个不忙也不被扣住的单元、一个正在运行的运行时，以及一份完整的选择；套用需要同样这些，只是单元可以是忙的，因为它什么也不预留。忙碌的单元上会写出这条提示：“单元处于准备、运行、暂停或保存状态时，‘快照’和‘判定’不可用。‘套用配方’在运行期间仍然可用，但联锁扣住这个单元时不行：链条已动作、等待复位、读数不可用，这三种情况都会拒绝它。” | 模型既没有数据记录也没有即时配方时。立即判定这一行需要一个数据记录和一个判定；套用配方这一行需要一个即时配方。 |

目录之后是这个模型的那些仪表画面，每张一行，用仪表画面的名称命名，用它自己的说明来描述（或者写“这个模型的一张仪表画面，为打开这个面板的那个单元画出来。”）。和目录里的卡片不同，一张仪表画面**在你把它打开之前一直是关的**；在一个单元上，它画的是为那个单元解析出来的那张仪表画面，高度按这一行上选定的值，头上写着仪表画面的名称。当那张仪表画面是空的或者已经被删掉时，它在一个单元上被略去。

单条命令卡片上的那几个选择器，一开始停在各自库的第一项上，只要你还留在这个单元上，就一直保留你选的东西。

## 顺序、开和关 {#order-on-and-off}

排布在第一次改动时就整份保存下来，因此这一页显示的顺序和保存下来的顺序是同一个。操作面板没有为之保存过一行的目录卡片读作开，排在这张操作面板确实保存过的所有东西之后，正因如此，一张没有人排过的操作面板会按目录顺序画出整份目录，而以后的版本新加的一张卡片，到达时是可见的，排在末尾。仪表画面那一行反过来：在你把它放进来之前一直是关的，而指名一张模型已经没有的仪表画面的那一行，会被丢掉。

## 在 View 上显示 {#show-on-view}

**在 View 上显示**是选中操作面板时详情栏上的那个开关。它显示当前的状态，它的悬停提示说明那个状态起什么作用：

| 状态 | 悬停提示 |
| --- | --- |
| 开 | “这个模型的每个单元都在可视化栏里为这个操作面板有一项。” |
| 关 | “这个操作面板从单元的‘操作’里打开。View 页面上不放它的任何东西。” |

开着时，会在 View 页面的可视化列里为这个模型的每一个单元放一个条目，名字写作 `模型 · 单元 · 界面`，穿着这张操作面板的图标；这个条目打开的是为那个单元画出来的这张操作面板的卡片。这些条目在 View 页面上永远不会被重新排序、编辑或复制（复制会被拒绝），而每个单元的条目可以各自归进 View 页面的文件夹。一个没有单元的模型什么也不往那里放。这个开关对没有管理 Process 的角色不画出来；在工程锁定和运行时已停止之下它仍然画出来，只是变灰，并说明是哪一种。这些条目长什么样，写在 [View 上的单元面板](view-unit-panels)里。

## 删除操作面板 {#remove-panel}

**删除操作面板**立在选中操作面板时详情栏的危险组里，也在树的右键菜单里，还有文件夹页面方块上那个叉。它会先问一次（“删除操作面板”“这会把这个操作面板从模型里删掉。”）。一个模型的最后一张操作面板会被拒绝：“一个模型至少保留一个操作面板，而这是仅剩的一个。”删掉之后，选中项落在这个模型的操作面板文件夹上，每一个单元都少了那一行，它的那些条目也离开 View 页面。它需要管理 Process 权限，在工程锁定和运行时已停止之下变灰。

## 在“操作”下面和在 View 页面上 {#under-operate-and-on-the-view-page}

这个模型的每一个单元，在**操作**下面每张操作面板带一行，排在它的仪表画面各行之前。选中它，就把这些卡片画在那个单元自己的运行和绑定上，穿着 View 页面所用的那条舞台栏：条目名称 `模型 · 单元 · 界面`、这张操作面板的图标、**展开**（“占用整个窗口”）、**全屏**（“全屏（F11）”），以及一枚在一次运行占着这个单元时显示它活动状态的胶囊（**记录中**、**已暂停**、**保存中**、**准备中**、**收尾中**，或者在一个设为等待的配方段的设定值还没被现场设备收下时显示**正在等待设定值抵达设备**）。这里没有复制，也没有编辑：那一行画的是这份排布，绝不排布它。这些卡片按各自的节奏刷新（在工作站自己的窗口上每 200 ms 一次，在浏览器上 400 ms 一次）。

没有运行流程权限的角色读到的是这条提示：“你可以在这里观看这个单元的运行状态，但启动或操控它需要‘运行流程’权限。”，而那些命令不画出来。一张卡片全关掉的操作面板会说“这个操作面板不画任何卡片。请在模型‘可视化’下的‘操作面板’一行里选择它的卡片。”这台工作站的配置被一次运行锁住时，这张操作面板照样可用：操作永远不会被工程边界拦住。

同样这些卡片，用同样的方式画出来，也正是一个 View 页面条目所打开的东西。

## 一张操作面板不做的事 {#what-a-panel-does-not-do}

- 它不自由地拼任何东西。自己的一幅画面是[一个模型的仪表画面](process-dashboards)，而一张操作面板随后可以把它画成自己的一张卡片。
- 它在单元之间没有任何差别。这个模型的每一个单元都按同样的顺序、同样的高度画同样的卡片；需要另一幅界面的单元，需要的是这个模型的另一张操作面板，而那一张随后每个单元也都带着。
- 它在 View 页面上不能被复制、重新排序或编辑，也永远不在 View 页面自己的文件夹里，除非是作为那个开关创建出来的按单元条目。
- 它永远不会藏起联锁提示条，也永远不会画一张单元没有东西可填的卡片。
