# Process

> 在这个工作区里，一个流程模型定义一次，落实到若干单元上，并作为有记录、有判定的试验跑起来：工作区栏、一个模型的四个分组、命令栏、权限的阶梯，以及两把锁。

**Process** 是搭建并随后运行一项试验或一道生产工序的那个导航栏页面。你把一个**模型**定义一次（它测什么、一次运行盖下什么、什么会自己带动一台工位、它产出什么、它在哪里打印），把它落实到若干**单元**上（那些物理工位，各自接到自己的信号源），从模型的各个库里组合出**流程**，然后在某个单元上把它们启动起来。每一次运行都记录进它自己那个自成一体的文件，因此一份已记录的运行记录，比产生它的那份配置后来的任何改动活得都久。同一套词汇既覆盖一次质量试验，也覆盖一道生产工序：任何按时间进行、要施加设定值、记录通道并对结果作判定的事情都算。

页面标题写着“Process：定义流程模型，把它们具体化到单元上，并运行有记录、有判定的试验。”只要一个身份持有四项 Process 权限（查看模型、运行流程、编辑配方与判定、管理 Process）之一，或者持有查看历史，这一页就为它打开。

## 这一区里有什么 {#in-this-area}

| 页面或分组 | 涵盖什么 |
| --- | --- |
| [模型与文件夹](process-models) | 模型根节点、一个模型自己的页面、复制模型、删除模型，以及你把模型、报告和标签归进去的那些文件夹。 |
| [单元](process-units) | 模型页面上的单元表格、添加和移除一个单元、在各个定义屏幕上选中的那个单元、操作下面的单元，以及全部启动和全部停止。 |
| [定义](process-definition) | 通道、元数据、自动化、产量和打印机：流程的结构，只有流程本身变了才动它。 |
| [可视化](process-visualization) | 仪表画面和操作面板：这个模型怎么展示自己，定义一次，为每一个单元绘制。 |
| [设定](process-setup) | 事件条目、别名、数据记录、配方、判定、动作和流程：试验台上的产品变了就要跟着变的东西。 |
| [操作](process-operate) | 每个单元一个节点，节点里装着预选、启动和观看一次运行所用的操作面板和仪表画面。 |
| [模板](process-templates) | 两个工作站范围的库，报告和标签，每个模型都共用。 |
| [历史](histories) | 已记录运行的浏览界面，也是这同一棵树的一个根节点。 |

## 这一页 {#the-page}

Process 是一个主从页面：左边是**工作区**栏，右边是这一栏所选中之物的详情面板，面板上方是一条命令栏，带着那个选择的动作。面板自动保存：一个开关在拨动时就生效，一个字段在你离开它时生效，被拒绝的写入会把字段放回去，并在窗口底部的操作记录条上说明原因。

这一页有两个地址。`/process` 打开在你的角色能看到的第一个根节点上。`/histories` 是指向历史根节点的深层链接，因此指向那些运行记录的书签仍然落在它们上面。带 `?focus=<id>&screen=channels`、`automation`、`action`、`view` 或 `screen` 的地址，会把工作区打开在那个界面上：[验证](validation)页面写前两个（模型的通道屏幕或自动化屏幕，出问题的单元那一行已经选好），[View](home) 页面写最后两个。你的角色看不到的 id，或者这一页不画的屏幕名，都会让页面按平常的样子打开。

一个角色一个根节点都没有时，面板写着：“这个工作区没有哪一支对这位操作员开放：模型和模板要在管理级别配置，已记录的运行则需要它自己的权限。流程是从某个单元的操作屏幕或者某张仪表画面上启动的。”

## 工作区栏 {#the-workspace-column}

一棵树，三个根节点：

| 根节点 | 装着什么 |
| --- | --- |
| **模型** | 工作站的每一个模型，按名称排列，每一个都带着它的四个分组。模型可以归进你自己的文件夹；文件夹只是导航用的，永远不进入地址。 |
| **模板** | 两个工作站范围的库：**报告**（PDF 版式）和**标签**（打印机命令文件）。两者都同样接受文件夹。 |
| **历史** | 已记录运行的浏览界面。它是一个叶节点：选中它就在详情面板里打开运行记录列表。 |

每一行生下来都是收起的；你打开你要的那一支，而你打开的东西在多次保存之间一直开着。会列出行的分组带一个计数标记 `（3）`，里面什么都没有时带 `空` 字，这样一台崭新的工作站就能把“这里没有东西”和“还没有载入”分开。定义下面那五行，以及三个分组行（定义、可视化、设定）不带标记：它们要么在面板里编辑，要么只是把别的行归在一起。操作会数它的单元。根节点、模型和文件夹用粗体绘制。

页脚带着**新建…**、**全部展开**和**全部收起**。新建…只对管理 Process 画出来，工作站被锁住时它变灰，理由写在悬停提示里。它打开一个菜单：**新建模型**、**新建报告**、**新建标签**，以及一个**新建文件夹**子菜单，它的三个条目（**模型**、**报告**、**标签**）在对应的根节点下打开一个空文件夹，名称字段已经就绪等你输入。每一个条目都在它那一类的根节点上创建；要在文件夹里面创建，那是文件夹自己的动作（它的命令栏，或者它的右键菜单）。

## 一个模型的四个分组 {#a-models-four-groups}

选中一个模型会打开它自己的页面：它的标识、单元表格，以及跨在它各个分组上的方块（见[模型与文件夹](process-models)）。它下面立着四个分组，按各自变动的频繁程度排序：

| 分组 | 行 | 分组页面怎么说 |
| --- | --- | --- |
| **定义** | 通道、元数据、自动化、产量、打印机 | “这个过程的结构：它在哪些工位上运行、测量什么、一次运行记录盖上什么、什么让工位自己动起来、它产出什么，以及在哪里打印。过程变了，它才变。” |
| **可视化** | 仪表画面（n）、操作面板（n） | “这个过程怎么显示自己：定义在它上面的操作员仪表画面，以及操作它的单元所用的界面。每一样只定义一次，供模型的每一个单元使用。” |
| **设定** | 事件条目、别名、数据记录、配方、判定、动作、流程 | “试验台上的产品换了就要改的东西：监视什么、通道以什么名字读出、记录什么、一次运行记录套用哪些设定值、按什么来判，以及把这些拼在一起的流程。” |
| **操作** | 每个单元一个节点，每个节点里这个模型的每张操作面板一个节点、每张仪表画面一个节点 | “这个模型运行在哪些工位上。打开一个即可预选流程、启动它，并观看一次带记录、有判定的运行。” |

三个分组页面是一面面跳转到某一行的方块墙：代表一个列表的方块显示它的计数，自动化、产量和打印机则显示它们的名称。操作把它的单元连同实时状态一起列出来。四者都不带自己的命令栏。

## 权限的阶梯 {#the-ladder-of-permissions}

Process 的访问是四项本地用户权限，在[用户](users)页面上按角色授予，每一项都包含它下面的那些（见[权限](users-permissions)）：

| 层级 | 它准许什么 | 树里显示什么 |
| --- | --- | --- |
| **查看模型** | 读每一个模型、单元、定义、设定界面和模板，但不运行、也不改动任何东西。 | 模型和模板整棵都在；每一个面板都被按住只读，一个动作也不画。 |
| **运行流程** | 在某个单元的界面上预选并启动流程；暂停、继续、停止和中止；备注；单条命令；全部启动和全部停止；复位。 | 和查看一样。 |
| **编辑配方与判定** | 设定下面的一切：创建、编辑和移除事件条目、别名集、数据记录、配方、判定、动作和流程。 | 每一个模型收缩到它的设定那一支，仍在它原先归属的文件夹里；模板不再出现。 |
| **管理 Process** | 一切：模型、单元、五个定义屏幕、可视化、文件夹、报告库和标签库，以及每一次重命名。 | 全部。 |

还有两位也伸到这一页。**查看历史**准许历史根节点（对于除此之外一无所有的身份，也准许这一页本身）。**编辑仪表画面**是模型的仪表画面上那个编辑仪表画面动作所要求的。

这一页和应用里每一条命令栏一样，把两种拒绝分开。角色永远不会被准许的东西根本不画出来。眼下被拒绝的东西留在原处、变灰，理由写在悬停提示里。角色用不了的菜单行写着“管理这个工作区需要‘管理 Process’权限。”；没有这一位就尝试重命名，答的是“重命名 Process 地址标识需要管理 Process 权限。”

## 命令栏 {#the-command-bar}

只要选中之物有动作，这条栏就立在那里：让它长大、复制它、编辑它或启动它的动作在左边，结束它的动作在右边，用危险色。选中之物两样都没有时，这条栏就不画。

| 选中的节点 | 前置动作 | 结束动作 | 需要什么 |
| --- | --- | --- | --- |
| 模型根节点 | **模型** | | 管理 Process |
| 一个文件夹（在模型、报告或标签下） | **模型** / **报告** / **标签**（在文件夹里面创建）、**新建文件夹**（一个子文件夹）、**重命名文件夹** | **删除文件夹** | 管理 Process |
| 一个模型 | **复制模型** | **删除模型** | 管理 Process |
| 报告 | **报告** | | 管理 Process |
| 一份报告 | **打印样张**（见[模板](process-templates)） | **删除报告** | 管理 Process |
| 标签 | **标签** | | 管理 Process |
| 一个标签 | | **删除标签** | 管理 Process |
| 仪表画面 | **仪表画面** | | 管理 Process |
| 一张仪表画面 | **编辑仪表画面**、**在 View 上显示**（一个开关） | **删除仪表画面** | 管理 Process；编辑器还要编辑仪表画面 |
| 操作面板 | **新建操作面板** | | 管理 Process |
| 一张操作面板 | **在 View 上显示**（一个开关） | **删除操作面板** | 管理 Process |
| 事件条目、别名、数据记录、配方、判定、动作、流程 | **事件条目**、**别名集**、**数据记录**、**配方**、**判定**、**动作**、**流程** | | 编辑配方与判定 |
| 一个事件条目、别名集、数据记录、配方、判定或流程 | | **删除事件条目**……**删除流程** | 编辑配方与判定 |
| 一个动作 | **命令** | **删除动作** | 编辑配方与判定 |
| 操作 | **全部启动**、**全部停止** | | 运行流程 |
| 正在编辑的一张仪表画面 | **结束编辑**（在编辑器自己那一条上） | | |

每一个创建动作都用一个占位名称造出它那一行（“新建模型 1”“报告 2”“流程 3”“通道 4”，这几个占位名称是操作员随后要改的数据，工作站按写下来的样子记录，因此换界面语言也不会跟着变）。它们都不会打开造出来的东西：画面转到列出这一新行的页面（从那个页面自己的命令栏里造，画面停在原处），树选中这个页面并展开它，新的一行在那里突出显示并滚动到可见处。页面是一面卡片墙时（模型根节点、报告、标签、它们的文件夹，以及模型里每一个列出卡片的分组），新的卡片就是突出显示的那一张；页面是一张旁边带着所选行面板的表格时（模型的单元、动作、某个动作的命令、通道、元数据字段），表格会选中新的一行，这就是它的标记。用卡片，或者树里那一行，打开这一项，给它起名是你在那里做的第一件事。每一个结束动作都先确认，用的是每一次配置删除都用的那同一个对话框（“要删除‘X’吗？…… 此操作无法撤销。”）；否、Esc 或在外面点一下都表示拒绝。删除文件夹是那个什么也不删的例外：它的确认会数一数有多少行要挪回根节点。

三个分组页面上、五个定义行上（它们的动作坐在屏幕自己那些区域的标题里）、模板和历史两个根节点上、操作下面的某个单元上，以及模型页面的单元表格上（它的动作坐在那张卡片的标题里），都不立命令栏。

工作站被锁住期间（见下），这条栏的每一个动作都变灰，理由写在悬停提示里。角色不持有的动作不画出来。

## 右键 {#right-click}

右键点一行会选中它，并把同样那些动作以菜单的形式打开。它还添上那些属于行而不属于命令栏的动作：模型上的**添加单元**（画面转到模型的页面，单元在那里的表格里被选中），模型、报告或标签上的**移动到**（一个新文件夹，行已经在一级文件夹里时是一个新子文件夹，或者那一类的根节点，或者任何已有的文件夹），通道上的**添加通道**和元数据上的**添加字段**（画面转到那一行的页面，新的一行在那里被选中），以及某个动作上的**添加命令**（画面转到这个动作的页面，命令在那里被选中）。工作站被锁住期间这个菜单不会打开，在角色不能改动的行上也不会打开。

## 工程锁定 {#the-engineering-lock}

只要任何一个模型的任何一个单元正被一次运行操作占着（准备中、记录中、已暂停、保存中、收尾中），整台工作站的配置就是只读的。页面顶部有一条提示条写着“工程已锁定：有一次单元操作正在进行。在每一个单元都结束之前，配置保持只读；运行控制和其他操作员动作仍然可用。”每一个 Process 面板都被按住不动，命令栏上每一个动作都变灰并写着“有单元在运行时配置是锁住的。”，打开着的仪表画面编辑器会关闭。Connector、Logic 和仪表画面被同一道边界锁住。操作下面的那些单元界面、它们的运行命令、View 页面和历史，全程都仍然可用。

## 运行时停止 {#the-stopped-runtime}

工作站的运行时停止期间，每一次 Process 改动（配置、预选、生命周期命令、备注、删除运行记录）都以“运行时已停止”被拒绝；全部启动和全部停止随之变灰。读取、历史、导出和报告仍然可用。

## 代理 {#agents}

本地回环的[代理访问](agent)endpoint 伸到的是同样那些模型和运行记录：读取工具 `process_models`、`process_runs`、`process_run` 和 `unit_status` 属于读取那一组，而操作工具（`process_start`、`process_stop`、`process_hold`、`process_resume`、`process_abort`、`process_snapshot`、`process_evaluate`、`process_recipe_apply`、`process_comment`、`process_report`、`process_run_delete`）则坐在代理页面上它们自己那个逐项开关后面。它们的写入以 Agent 记入日志。运行时停止期间，只有那些读取工具和 `process_report` 会作答。

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

- 它不从树里启动任何运行：一个流程是在操作下面某个单元的操作面板上、在某张仪表画面上、通过一个绑定的命令点位，或者由 PLC 通过自动化来预选和启动的。
- 它不给模型、文件夹或分组里的行重新排序：模型、流程和各个库按名称排列，动作按它们自己的顺序，单元按添加进来的先后。
- 它不从树里重命名：一个模型、单元、通道或元数据字段是在它自己的面板里重命名的，走的是那条会改写引用的安全重命名。
- 什么都不会被撤销：每一次删除都先确认，而这个工作区里的任何删除都绝不碰一份已记录的运行记录。
