# View 上的单元面板

> 操作一个 Process 单元所用的那一摞卡片，在 View 页面上的样子：它是怎么到那里的，每张卡片显示什么、让你做什么，以及它服从的那些 Process 权限。

**单元面板**是立在 [View](home) 页面上的一个 Process 界面：一个模型为操作它的各个单元所排好的那些卡片，为某一个单元画出来。它不是一幅仪表画面。它没有任何一处是在网格上拼出来的，没有编辑器为它打开，而且这个模型的每一个单元都通过同样这些卡片来操作，于是一排四台一模一样的工位只需要排一次。这份排布是在 Process 工作区里模型的**操作面板**行上做的（[操作面板](process-panels)）；本页写的是 View 所显示的这块面板。

## 一块面板怎么上到 View {#how-a-panel-gets-onto-view}

一个模型的每一块操作面板，在 Process 工作区它那一行的命令栏上都带着一个**在 View 上显示**开关（需要**管理 Process** 权限）。打开之后，这块面板为模型的每一个单元在可视化栏里放一项，命名为 `模型 · 单元 · 面板`，戴着在这块面板上挑的图标，没挑图标时则戴操作面板那个固定的标记。这些条目立在你的文件夹和画面后面**单元操作面板**这个抬头底下，直到你从它那一行的菜单把它归进某个文件夹，做法和你自己的画面完全一样；一个没有单元的模型什么也不放在那里。以同样方式在 View 上显示的模型**画面**是另一回事：它在画布上运行，并为它那个单元解析好，写在本页末尾。

舞台上的命令栏用完整名称写出这一项，并为可以管理模型的角色提供**在 Process 里编辑**，它打开这块面板在 Process 页面上自己的那一行。**复制**和**编辑**不画出来：这里没有布局可拿。**展开**和**全屏**和在任何画面上一样有效，状态栏保持打开。

## 权限 {#permissions}

看到一块单元面板需要**查看模型**；你自己那些仪表画面的可见性清单在这里不适用。凡是对这个单元下命令的都需要**运行流程**，没有这项权限的角色会读到这一摞卡片最上面的那条通知：“你可以在这里观看这个单元的运行状态，但启动或操控它需要‘运行流程’权限。”这时运行记录卡片既不画流程选择，也不画生命周期按钮，单条命令卡片根本不画，元数据的各个填写项不可用，而一张卡片里面的命令类组件会戴上锁标记，提示里写着“需要‘运行流程’权限。”**操作仪表画面**权限在这里不起作用。

另外两种拒绝来自工作站而不是角色，两者都写在发出这条命令的那张卡片上：为什么整台工作站不接受运行操作（运行时停止：“运行时已停止”），以及为什么偏偏这个单元不接受（比如一次已动作的联锁这样的执行屏障）。每一次按下都记下是谁按的：在这条连接上登录的用户，没有人登录时则是这台工作站。

## 那一摞卡片 {#the-stack}

这一项打开之后是一根竖着滚动的卡片列，顺序就是这块面板所排的顺序。每张卡片开头都是同样的头部：左边是它的名称，右边是此刻唯一能限定它的那样东西。一张工作站给不出东西可显示的卡片会被略去，而不是空着立在那里：没有数据记录、也没有即时配方可发的单条命令，一个没有可读通道的模型上的通道，预选流程一个字段也不提示时的元数据，画面已经没了或者仍然空着的画面卡片。一块一张卡片也画不出来的面板会说：“这个操作面板不画任何卡片。请在模型‘可视化’下的‘操作面板’一行里选择它的卡片。”

各卡片之上，还立着一条永远不会被排走的**联锁提示条**，只要模型的停机联锁已启用就有：单元正常时什么也没有；处于**已触发**时是一条严重提示条，带着理由、信号源、它的值和它的质量；处于**等待复位**时是一条注意色提示条，带着一个**复位**按钮，这个按钮只为拥有运行流程权限的角色画出。联锁是什么、怎么配置，写在[自动化](process-automation)。

### 运行记录 {#run}

为下一次启动预选的流程，以及操控这次运行的那些命令。

| 元素 | 它显示什么或者做什么 |
|---|---|
| 头部右侧 | 一盏灯加一个词：运行正在记录时是**记录中**，单元已被占用但还没开始记录时是**准备中**，其余时候是**未在记录**。 |
| 流程 | 一个挑选器，里面是“（无）”和这个模型的每一个流程。选中一个就把它预选给下一次启动；“（无）”什么也不预选。没有运行流程权限时，或者运行时停止期间，它不可用。工作站拒绝的一次预选（比如一份钉不住的别名集）会让挑选器弹回去，并在卡片上说明为什么。 |
| 启动、暂停、继续、停止、中止 | 生命周期命令，各自在这次运行能接受它之前一直变灰，提示里写着它做什么：“在这个单元上启动预选的流程”“冻结时间窗口；数据记录继续记录”“解除暂停，让窗口继续走”“干净地结束这次运行记录，并把它冻结成历史”“以中止方式结束这次运行记录；收尾块仍然执行”。只有预选的流程是时序型时才画出暂停和继续，因为只有时序窗口才冻结得了；什么也没预选时，整套都画出来。 |
| 命令下面的说明 | 这个单元最后拒绝的那条命令，接着是整台工作站以及这个单元自己不接受运行操作的理由，只要这些理由还成立。 |

启动会校验什么、每条命令对这次运行做什么，写在[运行记录与备注](process-runs)。

### 元数据 {#metadata}

预选流程每提示一个元数据字段就有一个填写项，底下那一行写着“‘流程’的下一次运行记录以什么身份记录下来。带 * 的字段每个流程都会提示填写。”手工字段是一个文本填写项，没有运行流程权限时不可用；序号字段从来不是填写项，而是对计数器将在启动时预留的那个标识的一次预测（预测不出来时写“开始时已预留”），提示里说明共用的计数器可能在那之前就动了。什么也没预选时，这张卡片写着“预选一个流程，它提示填写的字段就会出现在这里。”你键入的东西是全工作站范围的预选：另一条连接立刻看得到。

### 运行状态 {#run-state}

三个读数：**状态**（这次运行的状态，单元已被占用时是“准备中”，其余时候是“空闲”）、**循环**（“2 / 10”，或者“不循环”，只有预选的流程是时序型时才画，因为只有时序窗口才会重复）和**结论**（到目前为止证据所给出的结论，没有时写“无”）。没有运行记录占着单元时，仍然显示的结论属于上一次运行记录，这时读数的名字是**上次运行记录的结论**，免得被当成即将开始的运行记录的结论。这里什么都不上色。

### 备注 {#comments}

这个单元当前运行的备注时间线，抬头是时间线为自己写的那一行（是哪一次运行，或者根本没有）。每条备注写出它的时间、它的阶段和它的文字，带着**编辑**（就地改写；回车保存，Esc 取消）和**删除**（第一次按下用“要删除这条备注吗？此操作无法撤销。”把这一行准备好，第二次才删掉它）。**添加一条备注……**输入框和它的**添加**按钮，向当前的运行追加一条。这些全都需要运行流程权限；锁着的时间线照样可读，并在手势上写出理由。命令在输入框下面自己那条答复行上作答。

### 事件条目 {#occurrences}

这个单元当前和最近的事件条目发生记录，抬头是这张列表自己那一行。每一行带着事件条目的名称、它的状态、它已经 **活动** 了多久，信号源掉线时还有一个 **信号丢失** 或者 **信号不可用** 计时，以及它的消息。列表为空时会说出来。这些发生记录来自模型的[事件条目](process-occurrences)。

### 通道 {#channels}

这个单元可读的通道画在一张实时图上，每个系列按这个单元上对该通道的叫法命名（有别名时实时显示别名），并按通道在[通道](process-channels)里所声明的颜色和区段绘制。这张图带着画面上的图表打开时那一排标准按钮（框选一块区域放大、还原缩放、保存和复制 PNG、显示或隐藏系列、数据提示和全屏），它所要求的保留量没能整份批准时，图形下面还有一句说明；每个按钮做什么，写在[图表](view-charts)。

### 产量 {#productivity}

这个单元产出的数量、速率和结论台账，底下那一行写着“今天的生产活动。”或者“在最近 N 小时内的生产活动。”（或者天）。头部右侧是时段：**今天**（从本地零点算起）或者**最近 N 小时** / **最近 N 天**，也就是模型在[产量](process-productivity)里声明（或者单元覆盖）的那个滚动窗口。主体是三个读数（**产量**、**合格率**、**典型历时**，每一个都说出自己还缺什么，而不是画一个占位符：“没有参考值”“未分类”“未测量”），加上**产出台账**（每种产出一行：名称、带单位的数量，以及每经过一小时的速率，或者“没有历时”），加上**完成结果**统计（已了结、合格、不合格、无定论、未判定、已中止、失败），以及一个**按流程**的展开项，里面是同样这些数字按流程分开。一个没有任何流程贡献产量的模型会说：“还没有流程计入产出。请在某个流程上启用“生产产出”，这些指标才会开始。”；一个什么也没记录的时段则写“今天没有产出记录。”（或者那个窗口以内）。

### 单条命令 {#single-commands}

“在流程之外，对这个单元单独发出一条命令。”每一行只在模型声明了它所调用的那份库时才画出来：

| 行 | 控件 | 作用 | 什么时候变灰 |
|---|---|---|---|
| 快照 | 一个数据记录挑选器和**采集** | “立即记录一行数据记录，作为一次已完成的运行记录存入历史”：所挑数据记录的一行，变成一次生下来就已完成的运行记录。 | 没有运行流程权限、单元正忙（准备中、记录中、已暂停或者保存中）、单元或者工作站拒绝运行操作，或者已经有一次快照正在进行。 |
| 立即判定 | 一个数据记录挑选器、一个判定挑选器和**判定** | “立即拍一行快照，并按判定来判它”；结论记进历史。只有模型既有数据记录又有判定时才画出来。 | 和快照一样。 |
| 套用配方 | 一个即时配方挑选器和**套用** | “把配方的设定值经出口写一次（不记录运行记录）”；日志就是记录。只提供即时型配方。 | 没有运行流程权限、单元或者工作站拒绝运行操作，或者已经有一次套用正在进行。单元忙的时候它仍然可用。 |

单元忙的时候，卡片会解释：“单元处于准备、运行、暂停或保存状态时，‘快照’和‘判定’不可用。‘套用配方’在运行期间仍然可用，但联锁扣住这个单元时不行：链条已动作、等待复位、读数不可用，这三种情况都会拒绝它。”每条命令的结果落在状态栏的操作记录条里（“快照已记录。请看‘历史’。”“已判定。结论记在‘历史’里。”“配方已套用。”，或者那句拒绝）。各挑选器一开始停在每份库的第一项上，并在这一项还开着的时候记住你的选择。

### 把一幅画面当作一张卡片 {#a-screen-as-a-card}

一块面板也可以把这个模型的某一幅画面当作一张卡片带着，高度在这块面板上选（120 到 1200 px，默认 320），抬头是这幅画面的名称。这张卡片运行的是模型那唯一一份画面定义，并为这个单元解析好：每一条抽象通道都用这个单元自己绑定的信号源来回答。它放大到铺满这张卡片，从不滚动；滚动的是页面。它的各条命令服从上面那条 Process 规矩（只看运行流程），而一幅上面什么也没有的画面会被略去。

## View 上一个单元的画面 {#a-units-screen-on-view}

一个模型的画面，在它的仪表画面行上标了**在 View 上显示**之后，会在同一份列表里为每个单元放一项，命名为 `模型 · 单元 · 画面`。它不是一摞卡片：舞台像对待任何仪表画面一样在画布上运行它，并为它那个单元解析好，带着在模型那幅画面上选定的状态栏偏好和图标。它的命令只需要运行流程，看到它需要查看模型，而它是在模型的仪表画面行上编辑的（[模型的仪表画面](process-dashboards)），在那里打开的是同一个编辑器，只是模型的抽象通道排在每一份地址列表的最前面。

## 一块单元面板不做什么 {#what-a-unit-panel-does-not-do}

它绝不在 View 上被编辑、复制或者重排，绝不由模型来归档（只由你归档，一次一个单元条目），也绝不带可见角色清单。它自己什么也不记录：一次快照、一次判定或者一次运行，是通过 Process 那些服务记录的，再到[历史](histories)里读回来。而且它绝不画一张工作站没有东西可放的卡片，所以这一摞里缺了的那张卡片，是一张没有东西可显示的卡片，不是一张被关掉的卡片。
