# 模型与文件夹

> 模型根节点和它的卡片、一个模型自己那一页上的标识与结构、复制模型和删除模型，以及模型、报告和标签归入的那些文件夹。

一个**模型**就是那个类型：定义一个流程所用的抽象通道、元数据目录、自动化、产量规则和打印机，再加上一件产品向它索取的那些库和流程。它落实在**单元**（那些物理工位）上，而每一个单元都拿自己的信号源把整份定义跑一遍。这一页讲模型根节点、一个模型自己的页面、复制和删除一个模型，以及工作区栏里的那些文件夹。模型页面上的单元表格另有一页：[单元](process-units)。

每一个 Process 层级都能读模型；创建、重命名、复制、归档和删除一个模型则需要管理 Process。

## 模型根节点 {#the-models-root}

选中**模型**会打开一面卡片墙，上面那行写着“每个模型只声明一次抽象通道，再把它们具体落到各个单元上，运行带记录、有判定的测试。”一个模型或一个文件夹一张卡片，带着那一行的图标和名称；点一张卡片就打开它。模型的卡片上带一个危险色的**删除**图标，按它就走删除模型（见下）；文件夹的卡片上没有，因为文件夹不是一个能从这里删掉的行。一个模型都没有时，这面墙写着“还没有模型。添加一个。”

| 命令 | 做什么 | 什么时候变灰 | 什么时候不画出来 |
| --- | --- | --- | --- |
| **新建模型**（命令栏） | 在模型根节点上创建“新建模型 1”（已被占用时用下一个空闲编号），在这面墙上突出显示并滚动到可见处；这个模型不会被打开。 | 工作站被锁住时（“有单元在运行时配置是锁住的。”或者“运行时已停止”）。 | 角色没有管理 Process。 |
| **新建模型**（新建……菜单；根节点上的右键菜单） | 同上，只是从栏的页脚或者根节点的菜单发起；画面转到模型根节点。 | 同上。 | 同上。 |

一个模型生下来是空的：没有通道、没有单元、没有库、没有流程。它的四个分组和它们那些行立刻就在，因此这一栏已经显示出每样东西该往哪里放；只有它的操作面板那一行一开始就读作一张默认操作面板，直到你自己声明一张为止。

## 一个模型的页面 {#a-models-page}

选中一个模型会打开那一页，它说清这是什么、跑在哪里，上面那行写着“一个流程模型：只声明一次的抽象通道、试验台上的产品对它们提出的要求，以及它所运行的那些单元。”标题栏上带两枚小药丸：`rev <revision>` 和单元数。

### 标识 {#identity}

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **名称** | 对外的地址前缀：这个模型的每一个单元都在 `Process.<Model>.<Unit>` 上作答。 | 自由文本；创建时是“新建模型 1”（已被占用时用下一个空闲编号）。地址段保留字母和数字，其余一律变成 `_`，开头是数字时前面补一个 `_`。 | 提交（回车，或者离开该字段）是一次协调的重命名：每一处指向旧地址的活引用都会随之改写。你输入的时候，字段下面那一行预告它够得着多远：“正在检查引用…”，然后是“重命名会更新读取这个地址的 3 处位置。”“没有任何引用使用当前地址。”或者“有效地址不会改变，没有引用需要更新。”名称的地址段和另一个模型映射到同一个时，会在字段上被拒绝：“名称‘X’映射到的地址段‘Y’已经被‘Z’占用。” |
| **修订** | 自由文本，为了可追溯而带进每一次运行的快照。 | 任意文本；默认为空。 | 显示在 `rev` 小药丸里，并冻结进此后启动的每一次运行。没有任何东西强制或递增它。 |
| **附注** | 给人看的自由文本。 | 任意文本；默认为空。 | 没有任何东西读它。 |

没有管理 Process 时，以及工作站被锁住时，名称字段是禁用的；修订和附注在你离开字段时自动保存。

### 单元 {#units}

**单元**卡片立在标识和结构之间，只对管理 Process 画出来：这个模型落实到哪些工位上，每一个带着它的名称、代号、附注和通道覆盖情况。它写在[单元](process-units)那一页上。

### 结构 {#structure}

最后那张卡片写着“这个模型由什么构成，按各部分变动的频率排列：过程的结构、它怎么显示自己、试验台上的产品对它提出什么要求，以及它运行在哪些单元上。点一项即可打开。”，下面是四个方块：**定义**、**可视化**和**设定**只写名字，**操作**还带上它的单元数。点一个方块就在栏里选中那个分组。

## 复制模型 {#copy-model}

**复制模型**立在模型的命令栏上，也在它的右键菜单里（需要管理 Process；工作站被锁住时变灰）。它用选中的那个模型造出一个属于你自己的模型，转到模型根节点，那里这个副本的卡片突出显示并滚动到可见处，副本本身不会被打开，并报出“已把‘X’复制为‘Y’。打开副本即可编辑。”

跟着走的东西，每一行都带上全新的标识，行与行之间的每一处引用也重新映射到副本上：

- 标识那一行：修订、附注、外部停止开关连同它的默认信号和极性、默认滚动周期和那些命名数量、四个默认打印队列；
- 那些通道，连同它们的编号、名称、别名、别名作用范围、角色、类型、工程单位、颜色和分组；
- 元数据目录，连同它的流水号组成部分；
- 那些操作面板连同它们的卡片，以及这个模型的那些仪表画面（每一张都存成副本的仪表画面，它的地址从旧的模型名改写成新的）；
- 那些数据记录、带设定值和曲线段的配方、带判据的判定、事件条目、带条目的别名集、带命令和标记映射的动作，以及带各项选择的流程；
- 那些单元，连同它们的绑定、它们自己的数量、它们自己的打印机槽位和联锁信号源，以及它们的自动化（命令信号源、选择器代码、元数据映射、PLC 回写）。

不跟着走的东西：流水号计数器的状态（复制过来的字段从它的初始值起算，绝不与原来那个共用已预留的号），文件夹（副本落在模型根节点上），以及随产品附带模型的示例标记。凡是指向模型之外的东西（绑定的点位和变量、联锁和自动化的信号源、报告和标签模板、打印队列名称）都保留原值，因此副本指向的正是原来那个指向的东西；[验证](validation)会把你可能想换掉的那些引用列出来。

副本在源模型的名称还空着时取它，否则取“名称 (2)”“名称 (3)”；显示名称和它的地址段都必须是空着的。保存被拒绝时报出“模型没有复制成功：…”，什么也不留下；某张仪表画面存不下来时，副本就少了那一个界面，并报出“画面‘S’没有复制成功：…”。

## 删除模型 {#delete-model}

**删除模型**是模型命令栏和菜单里的结束动作，也是它在模型根节点上或它所在文件夹里那张卡片上的删除图标（需要管理 Process；锁住时变灰）。它先确认：“要删除‘X’吗？这会删除模型和定义在它下面的一切。正在使用的模型无法删除。 此操作无法撤销。”

工作站在操作记录条上拒绝时会说“它的某个单元正忙于一次运行操作时，无法删除这个模型。”和“它的某个单元的联锁处于锁定状态时，无法删除这个模型。”被删掉的模型把它的单元、库、流程、操作面板和仪表画面一并带走；它已记录的运行仍原封不动地留在历史里，因为一个运行记录文件与产生它的配置无关。删除之后，界面转到模型的上一级（它所在的文件夹或模型根节点），该节点在树中被选中并展开，其卡片墙可见，操作记录条写着“已删除。”

## 文件夹 {#folders}

模型、报告和标签各自都接受你自己的文件夹，最多嵌套两层。文件夹只是行被列出来的地方，别无他用：它永远不进入地址（不管一个模型坐在哪个文件夹里，它的单元仍然是 `Process.<Model>.<Unit>`），归档也不改写任何引用。名称比较时不分大小写，因此“Benches”和“benches”是同一个文件夹，按先看到的那种拼法绘制。文件夹画在最前，按名称排，排在没人归档的那些行上面。

| 命令 | 在哪里 | 做什么 | 什么时候被拒绝 |
| --- | --- | --- | --- |
| **新建文件夹** > **模型** / **报告** / **标签** | 栏的新建……菜单 | 在那个根节点上打开一个空文件夹，名叫“新建文件夹”（然后是“新建文件夹 2”，……），名称字段在那一行上就绪。按 Esc 就让它叫“新建文件夹”。 | 工作站被锁住；缺少管理 Process。 |
| **新建文件夹** | 一个文件夹的命令栏；它右键菜单里的**新建文件夹** | 在选中的文件夹里面打开一个子文件夹。 | 在第二层文件夹上写“这个文件夹已经到了文件夹能嵌套的最深一层。” |
| **模型** / **报告** / **标签** | 一个文件夹的命令栏；它菜单里的**新建模型** / **新建报告** / **新建标签** | 在那个文件夹里面创建那一行：文件夹的卡片墙把它突出显示并滚动到可见处，这一行不会被打开。 | 工作站被锁住。 |
| **移动到** | 一个模型、报告或标签的右键菜单 | 一个子菜单：**一个新文件夹**（生下来就装着这一行）、**这里的一个新子文件夹**（只有从一级文件夹里面才有）、**模型根目录** / **报告根目录** / **标签根目录**（这一行已经在那里时变灰），然后是这一类里除当前那个之外的每一个已有文件夹。 | “那个文件夹的嵌套层数超过了这里允许的深度。” |
| **重命名文件夹** | 一个文件夹的命令栏和菜单 | 在那一行上打开名称；里面的每一行，子文件夹也在内，都改归到新名下，你原本打开的东西仍然开着。 | “文件夹必须有名称，而且名称里不能包含‘/’。”；“这里已经有一个名为‘X’的文件夹。”（把两个文件夹并到一起是移动，不是重命名）。把同一个名字重新拼一遍是允许的。 |
| **删除文件夹** | 一个文件夹的命令栏（危险组）和菜单 | 确认“要删除文件夹‘X’吗？”，或者“要删除文件夹‘X’吗？它里面的 3 个模型会回到模型根目录。什么都不会被删掉。”，然后把里面的每一行都送回那一类的根节点，并把文件夹撤掉。 | 工作站被锁住。 |

一个文件夹的页面把归进它里面的东西作为卡片列出来，上面写着“归入这里的模型。文件夹只是整理这一列，别无他用。”（或者报告，或者标签）。空的那种写着“这个文件夹里还什么都没有。往里面添加，或者从列里把一行移进来。”每张卡片打开它那一行；模型、报告或标签的卡片上带着删除那一行的删除图标（删除模型、“删除报告”、“删除标签”，各有各的确认）。

处在编辑配方与判定层级的角色，仍然保留它透过其看到模型的那些文件夹，但不能创建、重命名、移动或删除文件夹。

## 四个分组页面 {#the-four-group-pages}

定义、可视化和设定打开的是同一种面板：分组的名称、它那一行说明（引在 [Process](process#a-models-four-groups) 上）和一张**内容**卡片，“这个分组里有什么。点一项即可直接跳过去。”，每一行一个方块。代表一个列表的方块显示它的计数（通道、元数据、仪表画面、操作面板、事件条目、别名、数据记录、配方、判定、动作、流程）；自动化、产量和打印机显示它们的名称，因为每一个都是一项设置，而不是若干行。操作打开的是另一种面板，也就是那些单元连同它们的实时状态，写在[单元](process-units#the-unit-under-operate)那一页上。

这四页都不带命令栏，也不编辑任何东西。

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

- 关于一个单元，这里除了名称、代号和附注之外什么都不配置：绑定、计数器、联锁、自动化、产量和打印机都在五个[定义](process-definition)屏幕上配置，每一个屏幕都一次显示全部单元。
- 模型不重新排序，它的名称也不从树里编辑。
- 文件夹里的模型不通过文件夹来寻址，移动它也不会改变任何读取它的东西。
- 什么都不会被撤销：复制模型是留住一个版本的办法，而一份已记录的运行记录，不管那个模型后来怎么样，都保留着产生它的那份配置。
