# 别名集

> 命名好的通道名称集，例如一件产品一套，可以在单元的绑定旁边应用到该单元，也可以锁定到某个流程上，预选它时就应用。

一个**别名集**是一列命名好的通道名称：这个模型里每一条允许某个单元重命名的通道，在这一套被应用之后，那个单元用哪个名称读它。它是用一个动作给整个单元重命名的办法，为某件产品或某个客户重命名，而不必把每一个别名重敲一遍。它住在 Process > 模型 > 某个模型 > 设定 > **别名**下面，需要**编辑配方与判定**权限。别名集只管显示：通道自己的名称仍然是这个模型每一件产物所引用的那个键。

## 别名文件夹 {#the-aliases-folder}

选中**别名**那一行会打开文件夹页面（“命名好的通道名称集合，例如一个产品一套。把一套应用到某个单元，一个动作就重命名它的所有通道；流程也可以锁定一套，这样预选它时就会应用这一套。”），一套一张卡片；点一张卡片就打开它，那个叉则把它删掉。一套都没有时，页面写着“还没有别名集。添加一个，为某个产品或某个客户给这个模型的通道命名，然后在单元的绑定旁边应用它。”

| 命令 | 做什么 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| **新建别名集**（选中文件夹时在详情栏上；右键**添加别名集**） | 添一个 `别名集 <n>`，还没有给任何东西命名。它被加进所属的分组，在那里突出显示并滚动到可见处；用它的卡片打开它。 | 任何一个单元上有运行，或者运行时已停止。 | 没有编辑配方与判定时。 |

## 这一套的页面 {#the-sets-page}

标题栏带着这一套的名称和一枚小药丸，数出它给多少东西改了名：“命名了 1 个通道”或者“命名了 `<n>` 个通道”。一套什么都没命名的别名集，应用起来什么也不改。

### 定义 {#definition}

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **名称** | 这一套在树里、在通道屏幕上的应用选择框里，以及在一个流程的别名集选择框里叫什么。 | 自由文本，离开字段时提交；创建时是 `别名集 <n>`。 | 给树里那一行重命名。 |

### 通道名称 {#channel-names}

这张卡片自己讲清它的规则：“别名留空，该通道就沿用它已经在用的名称。把这一套应用到某个单元，会覆盖该单元的全部别名，因此这一套没有命名的通道会回到通道自己的名称。”它下面立着一张表格，这个模型每一条通道一行，按模型的通道顺序排，因此一条通道在构造上最多被命名一次。

| 列 | 是什么 | 取值 / 默认 |
| --- | --- | --- |
| **通道** | 那条通道，写作 `Ch<number> · <name>`。 | 只读。 |
| **别名** | 这一套给这条通道起的名字。占位文字显示的是这条通道在模型上被读作的那个名称（它自己的别名，或者它的名称）。 | 自由文本，离开字段时提交；默认为空。输入一个名字就创建出这个条目；把它清空就移除这个条目，因此这一套只保存你确实命名过的那些通道。 |

模型让它只保留一个名称的通道（在通道表上它的**别名范围**是**整个模型**），会拒绝这个条目：单元格被禁用，悬停提示写着“这条通道对所有单元只用一个名称。要在别名集里给它命名，请先在‘通道’表里把别名范围改为每个单元。”别名集是给一个单元重命名的办法，因此它不能成为绕过那条声明的路。

## 谁来应用一套 {#who-applies-a-set}

一套别名集自己什么也不做。有两个动作把它应用到一个单元上，两者都是对那个单元按单元别名的一次完整、看得见的覆盖：这一套指名的每一条通道都取这一套的名字（通道原本还没有绑定时，绑定会被创建出来），这一套没有指名的每一条可重命名通道的别名都被清空并回到通道自己的名称，而模型让它只保留一个名称的通道，两种情况下都完全不去动。

| 动作 | 在哪里 | 会发生什么 |
| --- | --- | --- |
| 单元绑定旁边的**应用** | 定义 > 通道：在单元列表里点中一个单元；那一套的选择框和**应用**就和那个单元的绑定表立在一起（“把一套命名好的通道名称应用到上面的别名上。把这一套应用到某个单元，会覆盖该单元的全部别名，因此这一套没有命名的通道会回到通道自己的名称。在你重新应用之前，手工改动优先。”）。见[通道与绑定](process-channels#the-binding-table-of-the-picked-unit)。 | 这一套立刻写到那个单元的别名上并保存。之后你手工改的别名一直有效，直到你再次应用某一套。 |
| 一个流程**锁定**一套 | 设定 > 流程：流程的**名称**那一段上有一个**别名集**选择框。 | 这次锁定在这个流程于某个单元上被预选时检查：如果那个单元的别名已经和这一套一致，什么都不写；如果不一致，这一套就在流程被预选时应用到那个单元并保存，日志记下“Alias set pinned: '`<set>`' applied to '`<model>` · `<unit>`' by staging '`<procedure>`'”。写这一套是一次配置改动，因此有单元在运行时预选会被拒绝，写着“这个流程锁定了一个通道别名集。应用它会改动配置，而单元运行期间配置是锁定的。”，那个单元保留它原来预选好的流程。如果之后这一套或者那个单元的别名动了，启动会被拒绝，写着“流程锁定的别名集没有应用到这个单元上。请重新预选该流程。” |

流程页面上那一段写着“这个流程在某个单元上被预选时，给该单元的 `<n>` 条通道重命名”，也就是把写入发生的那个时刻点明了，同上。

两个动作都是配置写入：任何一个单元上有运行时它们都拒绝，运行时停止期间也拒绝，而通道屏幕上的应用按钮还需要那个屏幕本来就要求的管理 Process 权限。

## 别名在哪里显示 {#where-the-alias-shows}

一条通道在一个单元上当时生效的名称只有一条规则：通道允许、而且这个单元持有时，用这个单元自己的别名；否则用通道自己的别名；再否则用通道的名称。一套别名集只写这三者里的第一个。

| 界面 | 它读什么 |
| --- | --- |
| 操作下面和 View 页面上，一张操作面板的**通道**卡片 | 每一条系列都按它在那个单元上当时生效的名称来命名。 |
| 这个模型解析出来的一张仪表画面 | `{channel.name:...}` 记号变成当时生效的名称（见[一个模型的仪表画面](process-dashboards)）。 |
| 运行记录文件 | 启动时把每一个记录列当时生效的别名，连同通道的名称和编号一起冻结下来。 |
| 历史里这次运行的图表 | 每一列读作 `Ch<number> · <alias>`，当时没有别名生效时则读通道的名称。 |
| PDF 报告 | 冻结在这次运行里的那个别名，没有别名时则是通道的名称。 |
| CSV 和 XLSX 导出 | 每一列的表头是冻结在这次运行里的那个别名，没有别名时则是通道的名称，连同它的工程单位。 |
| Logic 地址、事件条目条件 | 通道的名称。别名绝不改变 `Process.<Model>.<Unit>.Channels.<Channel>`，也不改变条件里的 `Channels.<Channel>`。 |

## 删除别名集 {#remove-alias-set}

**删除别名集**在选中这一套时立在详情栏的危险组里，也在它的右键菜单里，还是文件夹页面卡片上那个叉。它先问一次（“删除别名集”，“这会删除这个别名集及其条目。”）。锁定了这一套的流程会把它的别名集引用清空；这一套曾经应用过的单元保留已经写下去的那些别名，因为那些是那个单元自己的。它需要编辑配方与判定，在工程锁定和运行时停止之下变灰。

## 一套别名集不做的事 {#what-an-alias-set-does-not-do}

- 它不给任何通道重命名，也不改任何地址。模型的通道名称、Logic 地址空间和事件条目条件，用的都是通道自己的名称。
- 它不会自己应用自己。一套别名集被应用之后再去编辑它，在它被再次应用之前（手工应用，或者预选一个锁定了它的流程）不会改变任何单元上的任何东西。
- 它不能给一条模型让它只保留一个名称的通道命名，也不能把那个开关打开：那个决定是通道的，在通道表上。
- 它不往正在运行的单元里写任何东西：应用是一次配置写入，和其他每一次一样要等工程锁定。
