# 自动化

> 没有人按按钮时什么会带动一个单元：模型的外部停止和每个单元跟随的那个信号、每个单元的停止联锁，以及朝着 PLC 那一侧、负责选流程、驱动生命周期并回送结果的自动化。

**自动化**屏幕（Process > 模型 > 定义 > 自动化）装着一切在没有人按按钮时带动这个模型某个单元的东西。上面是模型自己的声明：**外部停止**，一个开关，它让这个模型上的每一个流程都跟随各单元观测到的停止信号，以及整张试验台跟随的那个默认信号。下面是那些单元，被选中的单元有两张卡片：它的**联锁**（它观测哪个信号，以及它的实时状态）和它的**自动化**（朝着 PLC 那一侧的接口，负责选流程，驱动启动、停止、暂停、继续和中止，快照元数据并回送结果）。标题栏写着“什么让这个模型的单元自己启动、暂停和停止：它跟随的停止信号，以及 PLC 驱动它所用的那些信号。”

读取需要查看模型；每一次编辑都需要管理 Process 和一台没有被锁住的工作站，而联锁那些字段还带着它们自己第二道门槛（见下）。这个屏幕穿着每个定义屏幕共用的那一副样子（见[定义](process-definition#the-one-shape-of-the-five-screens)）。

这两件事在性质上不同。联锁是一次持续的监视，它结束一次运行，让单元的锁定挺过应用重启，并在有人复位之前挡住对它信号源的写入。自动的中止则是一次性的命令，只结束正在进行的那次运行。它们共用一个屏幕，是因为两者都靠选一个现场信号来配置。

## 模型定义：外部停止 {#model-definition-the-external-stop}

标题栏写着“模型的声明。它对每个单元都有效：一个开关决定整张试验台是否观测停止信号，一个信号是它们跟随的默认信号。”这张表今天只有一行：

| 列 | 显示什么 |
| --- | --- |
| **声明** | 外部停止。 |
| **是否观测** | **已启用**或者**已关闭**。 |
| **默认信号** | “点位 · Simulated · Press · EStop · 为真时触发”；“未选择信号”（只有在已启用时才用警示色）；或者存下来的信号源已经不在时写“信号已不再可用 · 为假时触发”。 |

表下面立着整个屏幕的那条原则：“仅作监视。这项软件观测不是经过认证的安全功能，不能代替机器的急停回路、安全继电器或安全 PLC。”

### 声明的设置栏 {#the-settings-column-for-the-declaration}

点中那一行会打开**外部停止**卡片（“自动化 · 外部停止”）：“让这个模型上的每一个流程都跟随各单元观测到的外部停止信号。”启用时它的小药丸数出覆盖情况（“3 个中有 2 个有信号”），关闭时数出单元数（“3 个单元”）。

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **为这个模型启用** | 那一个开关。 | 开 / 关；默认关。 | 关着时，任何单元上都不观测什么，也不挡住任何执行，按单元的那些字段折起来。开着时，每一个单元都通过它上面生效的那个信号被观测。 |
| **布尔信号源** | “这个模型的每个单元观测的信号，除非它自己另有一个。” | **（无）**，然后是已启用设备上的每一个布尔点位，写作“点位 · 驱动 · 设备 · 点位”，再然后是每一个布尔变量，写作“变量 · 名称”（放在文件夹里的变量写作“变量 · 文件夹 / 名称”，同名的变量也能分清）；默认（无）。工作站已经不再提供的、存下来的信号源仍然列出，写作“点位缺失”或“变量缺失”再跟上它的标识，因此这个字段永远不会读起来像没绑东西。 | 写在模型上：每一个跟随它的单元立刻就看到。 |
| **触发极性** | 哪一个读数算停止。 | **为真时触发**、**为假时触发**；默认为真时触发。 | 另一个值就是安全读数。 |

开关关着时，这个开关和那个默认值仍然可写，因此一张试验台可以先备好再投入。字段下面，卡片在只读时说明为什么：这个模型有任何单元被一次运行操作占着或者持有一个锁定的触发时，写“更改这项设置之前，请先结束正在进行的运行操作，并把每一个锁定的单元复位。”；否则写“更改模型的保护设置需要‘管理 Process’权限。”保存也同样拒绝，说“单元正忙或者处于锁定时无法禁用联锁。”，并且拒绝任何会挪动一个正忙或已锁定单元所观测信号的改动，说“单元‘*名称*’正忙或者处于锁定时，无法更改它的联锁信号源或者极性。”保存下来的信号如果同时指向点位和变量，或者带着空的标识，就会被持有它的那一行拒绝：模型的默认设置是“模型‘*名称*’的默认联锁信号源同时指向点位和变量，或者带着空的标识。”，单元自己的是“单元‘*名称*’的联锁信号源同时指向点位和变量，或者带着空的标识。”

## 按单元：单元列表 {#per-unit-the-units-list}

| 列 | 显示什么 |
| --- | --- |
| **单元** | 单元的名称。 |
| **联锁信号** | 当时生效的信号，以及它是从哪里来的：“点位 · … · 为真时触发 · 来自模型”或者“· 来自这个单元”；模型在观测时用警示色写“模型没有指定信号”或“未选择信号”；否则写“这个模型已关闭”。 |
| **自动化** | **已启用**或者**已关闭**。 |

标题栏最末端的**管理单元**打开模型的页面。

## 被选中单元的联锁卡片 {#the-interlock-card-of-the-picked-unit}

卡片的小药丸写出实时状态：**已禁用**（模型的开关关着）、**不可用**、**正常**、**已触发**或**等待复位**。

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **这个单元的停止信号从哪里来** | 两个写全了的答案。 | **跟随模型的默认设置**（“从模型读取。给这个单元一个自己的信号，才能在这里更改。”）或者**有自己的信号**（“只有这个单元监视这个信号。模型的默认设置不再影响它。”）；默认跟随。 | 脱开时从当时生效的信号起算：从没指定过自己信号的单元取模型的那个，原本有过的单元原封不动地拿回它自己的。重新跟随不抹掉任何东西。 |
| **布尔信号源**、**触发极性** | 和模型用的是同一个选择框。 | 同上。 | 单元跟随期间它们是禁用的（显示的是模型存下来的答案，不是一份副本），单元正忙或处于锁定时也是禁用的。 |

字段下面是：**信号源**（解析出来的名称，或者“未配置”）、**当前值**（真、假，或者“未读到”）和**质量**（良好或不可用）。状态不是正常时，一条提示条带出这个状态和它的理由（一开始是“正在等待信号源的第一个有效读数。”）。模型的开关关着时，卡片写着“它随模型的‘外部停止’一起打开，那一项在上面的定义里声明。”，并把那个二选一和那一对字段折进一个**信号与极性**折叠区里，好在模型投入之前先备好。卡片以“这个单元有运行操作或者有锁定的触发时，信号源和极性保持不变。”或者“更改这项保护设置需要‘管理 Process’权限。”收尾，取决于是哪一种情况。

### 联锁的那些状态 {#the-interlock-states}

| 状态 | 含义 |
| --- | --- |
| **不可用** | 还没有一个有效读数把联锁投入，或者当时生效的信号什么都没指名。新的执行和继续都会被拒绝；持久保存下来的运行会以休眠而不是失败的方式挂上去。 |
| **正常** | 信号源良好，而且报出的是安全值。 |
| **已触发** | 停止条件成立，或者投入之后信号源的质量丢了。 |
| **等待复位** | 信号源又好又安全了，但持久保存下来的那条锁定仍然需要手动复位。 |

一次触发会通过正常的收尾把这个单元活动的运行结束为已中止，结论为不合格，并把 `StopInterlock` 记为结束原因；它让这个单元的锁定挺过应用重启；挡住它上面每一次新的执行；并在这个单元可写的信号源上叠一层写入阻断。被好几个单元共用的信号源，只有在它们全部处于联锁时才被阻断，因此一处局部停止不会把一个健康的邻居也困住。每一次状态变化都连同名称、值、质量、极性、时间和当事人记入日志，并出现在 [Events > 联锁](events-interlocks)里。

**复位**不在这个屏幕上：它立在单元操作面板的联锁提示条上，以及 InterlockStatus 仪表画面组件上，而且只有在状态是等待复位、读数又好又安全时才有。它需要运行流程，它清掉锁定，绝不重新启动被中止的那次运行，并连同操作员一起被记录下来。

## 被选中单元的自动化卡片 {#the-automation-card-of-the-picked-unit}

“让一个 PLC 点位或一个 Logic 变量来选择流程并驱动这个单元的生命周期，同时不取消手动、仪表画面和 MCP 的控制。”小药丸写着**已禁用**、**就绪**、**未就绪**或**活动**。没有管理 Process 时，卡片写着“编辑自动化需要‘管理 Process’权限。”，每一个控件都是只读的。

开关立在卡片上：**为这个单元启用自动化**（“观测发布出来的值，用它们选择流程并驱动生命周期。”）。它下面立着五个可折叠的小节；把开关打开会展开**流程**，关掉则把五个都收起来，此外这些小节就保持你离开时的样子。每一个信号源下拉框先提供**（无）**，然后是工作站的点位，写作“点位 · 驱动 · 设备 · 点位”，以及变量，写作“变量 · 名称”（放在文件夹里的变量写作“变量 · 文件夹 / 名称”），并收窄到这个字段能用的范围；工作站已经不再提供的、存下来的信号源仍然列出，写作“点位缺失”或“变量缺失”再跟上它的标识。

### 流程 {#procedure}

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **流程选择方式** | 一次自动启动所用的流程怎么解析出来。 | **固定流程**、**数字选择器**；默认固定流程。 | |
| **固定流程** | “这个单元的每一次自动启动都用这个流程。” | **（无）**、按名称排列的这个模型的那些流程，或者对已被删除的流程写“流程缺失”再跟上它的标识；默认（无）。 | |
| **选择器信号源（整数点位或变量）** | “PLC 写入一个整数代码；下面的映射表按稳定的身份把它解析成一个流程，因此重命名绝不会破坏这张表。” | 一个可读的整数点位或变量；默认（无）。 | |
| 那张代码映射表 | 每一个选择器代码一行：代码、它选中的流程、**删除选择器代码**；再加一行用来添加（一个代码、一个流程、**添加**）。 | 整数代码，在这个单元内唯一。 | 操作记录条上的拒绝：“选择器代码必须是整数。”“请为这个选择器代码选一个流程。”“选择器代码 7 已经配置过了。”“请选一个流程，或者删掉这一行选择器。”没有映射或者读不出来的代码会以选择无效拒绝这次启动。 |

### 命令信号 {#command-signals}

“每条生命周期命令可选配一个布尔信号源；信号由关变开时各触发一次。”每个命令一个选择框：**启动**、**停止**、**暂停**、**继续**、**中止**，每一个都收一个可读的布尔点位或变量，或者（无）。一个信号只有在看到过一次有效的低电平之后才投入，因此开机时就卡在高电平的信号无法触发。

### 元数据来源 {#metadata-sources}

“自动启动时，每个元数据值从哪里取；启动被受理时冻结进这次运行记录。”这一节列出选择方式能解析出的每一个流程（固定的那一个，或者按代码顺序排列的每一个已映射的流程）；在选出一个之前，它写着“请先选定一个固定流程或映射到的流程，才能列出它的元数据字段。”每个流程下面，它所提示的每一个字段各有一个选择框（必填字段标着“必填”；不提示任何元数据的流程写“这个流程不提示填写任何元数据。”）：

| 字段类型 | 可选项 |
| --- | --- |
| 文本 | **（无）**、**固定值**（选择框下面出现一个文本字段）、任何可读的点位或变量，图片、图标和颜色变量除外。 |
| 数字 | **（无）**、**固定值**、任何可读的整数或小数点位或变量。 |
| 流水号 | **（无）**或者**自动流水号**，它唯一的来源。 |

这些值在启动时校验；无效的值会以元数据无效拒绝这次启动。

### PLC 回写 {#plc-returns}

“可选的可写点位，把自动化状态回送给 PLC。”回写只绑到可写的点位上，绝不绑到变量上。

| 回写 | 期望什么 | 含义 |
| --- | --- | --- |
| **就绪** | 布尔值 | “现在能否接受启动” |
| **活动** | 布尔值 | “单元是否有活动的运行记录” |
| **所选代码** | 整数；只有数字选择器方式下才提供 | “回送观测到的选择器值”。在那种方式下做好的映射，在单元换成固定流程之后仍然保留，但只要那种方式还在，它既不会被写，也不会列在诊断里，而随着方式一起回来。 |
| **命令结果** | 整数 | “固定结果 0–7”，就是下面那份固定约定 |

| 代码 | 含义 |
| --- | --- |
| 0 | 等待 / 已复位 |
| 1 | 已受理 |
| 2 | 单元未就绪 |
| 3 | 选择无效 |
| 4 | 元数据无效 |
| 5 | 命令不相容 |
| 6 | 命令冲突 |
| 7 | 内部故障 |

“一份固定的约定，因此 PLC 的逻辑绝不依赖消息文字。”

### 实时状态与诊断 {#live-state--diagnosis}

每一次绘制都实时读出：**状态**（已禁用、已启用，或者“已启用 · 仅监视”）、**命令投入**（“没有命令信号”“已投入”或者“等待有效的低电平”）、**就绪**（是或否，并带“未就绪的原因”和那个理由）、**活动的运行记录**、**选择器**（选择器方式下是那个代码和它的质量）、**解析出的流程**、**上一条命令**（那个命令、它的结果代码和它的时间）和**原因**（最近一条诊断）。它们下面是三块：**命令信号**（每个信号源、它的值和质量、已投入或等待中）、**元数据预检**（每个字段的信号源、值、质量、有效或无效以及原因）和**回写**（每一个点位按它所带的名称、它上一次写入的时间、正常或失败以及那个错误；某个回写在当前选择方式下从不被写时不列出来）。一直失败的回写只在开始失败时记一次日志，持续期间做摘要，恢复写入时再记一次，而不是循环每转一圈就记一次。这个循环把一个回写交出去就接着走，所以一台慢设备绝不会把它拖住：正常还是失败，是在现场设备答复时才记下的，那可能已经在提出请求的那一轮巡检之后了；而上一次交出去的还没有回音的回写会被放着不动，不再重发一遍，所以一台慢设备收到的是一次写入，不是一百次。

这张卡片上的每一次编辑都自动保存，工作站拒绝时会把它放回去；理由落在操作记录条上。由自动化启动的运行，记下的责任人是**自动化**。

## 这个屏幕不做的事 {#what-this-screen-does-not-do}

- 联锁是对 Connector 或 Logic 已经发布出来的一个值做的软件观测：不去抖动、不做求值、也没有安全等级。它绝不代替机器的安全回路。
- 自动化不取消别的控制：手工、仪表画面、命令点位和 MCP 的命令都照样在它旁边工作。
- 这里没有任何东西会给一个单元复位：复位住在单元的操作面板上，以及 InterlockStatus 组件上。
- 这里没有任何东西会手工预选流程或者手工填元数据：那是[操作](process-operate)下面单元的操作面板的事。
