# 运行档案

> 打开一次运行记录会看到什么：它上方那条动作、带状态、开始时记下的元数据和两个当事人的表头、联锁提示、数据记录图表、判过的判据，以及事件条目的发生记录。

选中一条运行记录，它的档案就在浏览界面的右半边打开：先是一条动作，档案滚动时它固定不动，然后是表头、数据记录图表、判过的判据、**报告**和**标签**两个卷宗（见[标签与报告][labels-and-reports]）、写入过数据库的运行记录还有**数据库行**卷宗、事件条目，以及备注和标注（见[备注与标注](histories-notes)）。什么都没选中时，面板写着“选中一条运行记录，即可查看它的数据记录、结论、判过的判据、标签和事件条目。”

[labels-and-reports]: histories-documents

## 那一条动作 {#the-strip}

这些动作作用在打开的那条运行记录上，所以它们跟着档案走，而不是放在页面自己的命令栏上。先是可携带的副本，然后是生成出来的文档，最后是危险动作。登录角色不具备某个动作所需的条件时，那个动作根本不会画出来：这一条的长度就是该角色能做的事情的长度。眼下被情形拒绝的动作留在原处、变灰，悬停提示说明缺了什么（“请先选一条运行记录。”“这条运行记录还在记录。请先把它结束。”“还有另一条运行命令在执行。”）。

| 命令 | 做什么 | 什么情形下变灰 | 需要什么（没有就不画出来） |
| --- | --- | --- | --- |
| 导出 CSV | 把原始数据记录以 CSV 下载下来。 | 这一条上还有另一个动作没有跑完。 | 导出/导入历史 |
| 导出 XLSX | 把运行记录的标识、元数据和带类型的数据记录以 Excel 工作簿下载下来。 | 同上。 | 导出/导入历史 |
| 导出 GLAB | 把整条运行记录以可携带的 `.glab` 文件下载下来。 | 运行记录不是已完成、已中止或失败。 | 导出/导入历史 |
| 生成 PDF，配合**“生成 PDF”所用的报告** | 用选中的版式（“（流程自带的报告）”或库里任何一个版式）排出这次运行记录的 PDF 并打开它。 | 运行记录仍处于运行中或已暂停。 | 导出/导入历史 |
| 新建标签，配合**“新建标签”所用的标签** | 从这次运行的流程所配置的标签里挑一个，在运行记录的标签一节中记下一件新的标签产物，并且不发送任何东西。 | 没有配置标签（“这条运行记录的流程没有配置标签。”），选中标签的模板已经不在或者是空的，工作站处于只读状态。 | 查看历史、运行流程 |
| 删除 | 确认之后删除这次运行记录和它的文件。 | 运行记录处于运行中、已暂停或保存中；工作站处于只读状态。 | 管理历史 |

每一种导出包含什么、PDF 在哪里打开，见[导出一次运行记录](histories-export)；标签选择框在标签卷宗那一节里说明。

## 表头 {#the-header}

表头由运行记录名称、一行状态（“正在查看 · 名称”；还什么都没记录的运行记录写“正在运行 · 名称（快照待写入）”；文件里没有任何行的已结束运行记录写“没有数据 · 名称”）、这次运行在开始时记下的元数据和两个当事人组成。

元数据是这次运行在开始时记下的每一个字段一对，按提示顺序排列，用的是字段当时的名字：序列号、批次以及其他每一个字段，都从运行记录文件里读出来，所以字段此后改名或者被删掉，这里都不会有任何变化。**数字**字段按工作站的数字格式（[语言与格式](settings-localization)）显示，保留操作员输入的小数位数：`12.50` 保留两位小数，在用逗号写小数的工作站上显示为 `12,50`。它从不加千位分隔符：作为数字记下的批次或零件号是一个标识，而不是一个数量，所以 `1024` 在任何工作站上都显示为 `1024`。其他所有值，包括流水号标识，都按记录时的原样显示；操作员在开始时留空的字段显示缺口短横。对这一栏来说太长的名称或文本用省略号截断，完整内容在悬停提示里；数字绝不截断。没有记下任何元数据的运行记录，比如快照或判定，什么都不显示。

两个当事人：

- **启动者**来自运行索引，所以每一条运行记录都有，哪怕它还在记录：写的是操作员当时的名字，或者工作站、自动化、代理。
- **停止者**只存在于已封存的运行记录文件里。运行记录还在活动时它写**仍在记录**；否则它写出是谁要求停止或中止的，或者说明一次没有人要求的结束：**联锁**、**无人（这次运行失败了）**，或者**无人（自行结束）**，后者用于跑完时间窗口的运行、即时运行和单条命令。

运行记录被暂停过时，这两行之间还有**暂停者**和**继续者**：写的是最后一次暂停和最后一次继续是谁做的、在什么时候，写法相同（操作员当时的名字，或者工作站、自动化、代理）。从没被暂停过的运行记录两行都没有。

导入进来的运行记录会多出一行 `导入于 <时间> · 来自 <文件>`。那些小标记会重复自动化和已导入两个标记，运行记录还在活动时显示**记录中**，不活动之后显示结论标记。被单元的停止联锁结束的运行记录带着**由联锁结束**这条提示：“这条运行记录仍为已中止，结论为不合格。结束原因记录着：是这个单元的外部停止信号结束了它。”

因工作站内部故障而失败的运行记录带着**因故障结束**这条提示：先是一句指出哪个环节出了故障的话，接着是“技术细节保存在工作站的诊断日志中。”那句话是下面之一，用工作站的语言书写；错误本身只写进诊断日志。

| 句子 | 何时出现 |
| --- | --- |
| 无法写入运行记录文件，记录因此停止。 | 运行记录文件拒绝了运行记下的一行数据。 |
| 读取或判定一行数据时出错，采样已停止。 | 采样在读取或判定一行数据时出了故障。 |
| 无法将运行进度保存到工作站的历史中，记录因此停止。 | 在历史中标记运行仍然存活的定期写入失败了。 |
| 配方因内部错误而停止。 | 发送配方设定值的部分出了故障。 |
| 运行的周期计时因内部错误而停止。 | 有时间窗口而没有配方的运行中，为周期计时的时钟出了故障。 |
| 运行在启动过程中失败。 | 运行创建之后、开始记录之前，有环节出了故障。 |
| 工作站重启后，无法继续这次运行。 | 重启之后无法接续这次运行：它的文件、流程或单元无法访问，或者一条更早的运行记录已经占用了该单元。 |
| 保存运行时工作站关闭了。 | 写入运行结束信息的过程中工作站停止了。 |
| 无法保存运行的结束。 | 保存运行的结束信息或关闭其文件失败了。 |

在更早的版本中失败的运行记录，或者历史条目是从文件重建的运行记录，读作失败但不带提示。停止或中止的运行记录，以及由联锁结束的运行记录，都不会带这条提示。

## 数据记录图表 {#the-datalog-chart}

档案把这次运行记录下来的通道就地画出来，横轴是从第一个采样点算起的相对秒数，每条系列用随运行记录一起冻结的颜色，标注的是该通道在单元上当时的名称。分层的带状区域同样随运行记录一起冻结，因此即使模型后来重新分了组，档案和报告画出的仍是工作站当时显示的那张图：每一层一把标尺，共用同一根时间轴。标注画成醒目的标记，运行期间带时间戳的备注画成暗淡的标记。流程判定里的合格范围带则是每次打开运行记录时按当前配置重新解析的，因为运行记录文件里只把限值当作显示文本保存：判定被删除，带状区域就没有了，相对限值也不会画出来。图表带着公共工具栏（见[图表](view-charts)），其中包括把同一张图在它自己的窗口里打开的那个按钮（`/chart/run/<id>`），那个窗口会从文件里重新载入运行记录，并把它的缩放与就地图表联动；那个窗口是只读的，需要的权限和浏览界面一样。

## 判过的判据 {#judged-criteria}

这次运行的流程判定了判据时，档案会为每一个判定窗口列出一行：

| 列 | 内容 |
| --- | --- |
| 循环 | 这条判据是在第几个循环里判的，从 1 开始。 |
| 判据 | 记录当时所配置的判据名称。 |
| 通道 | 它监视的那个通道。 |
| 限值 | 合格范围，按冻结进运行记录的显示文本写出。 |
| 严重程度 | 这条判据被配置成对结论有多大分量。 |
| 结果 | 这个窗口判出来的是合格、不合格还是无法判定。 |
| 证据 | 先写判的是哪一段，再写四个采样点计数：“已判定 n · 越限 n · 不可用 n · 无效 n”。那一段写作“整次运行记录”，循环运行里写“第 N 个循环”，时间窗口写“2 秒至 10 秒”或“2 秒至结束”，曲线段和它的稳定等待写“第 3 段”或“第 3 段，5 秒后”，循环之内写“第 N 个循环，2 秒至 10 秒”；单个采样点方式的判据再加上“最后一个采样点”（“整次运行记录，最后一个采样点”），它的计数只属于这一个采样点。早先版本记录的运行只显示计数。 |
| 受影响 | 哪些通道因为采样点不可用或无效而削弱了证据；证据完整时写占位符。 |
| 最差 | 计入的采样点里越过边界最远的那个距离。写到小数点后三位；三位会读成零时，写到更多位。有采样点被判定而且没有一个越限时写 0，什么都没判定时留空。早先版本记录的运行在没有越限的地方留空。 |
| 附注 | 结果为无法判定时，说明为什么。 |

## 事件条目 {#occurrences}

这次运行监视了事件条目时，档案会推导出**发生记录**，一次成立一行，而不是一次原始状态变化一行：

| 列 | 内容 |
| --- | --- |
| 事件条目 | 这个事件条目的名称。 |
| 严重程度 | 监视当时冻结下来的严重、警告或提示。 |
| 开始时间 | 这段发生记录是什么时候开始的，或者写“未知”。 |
| 结束 / 状态 | 它在什么时候、以什么方式结束（“已复归”），或者它未结束的状态：“活动 · 实时”“运行记录结束时仍活动”“已中断”“不完整”“不一致”。 |
| 持续时间 | 条件成立了多久，仍然成立时带“· 实时”，被运行记录的结束截断时带“· 已监视”。 |
| 信号不可用 | 这段发生记录期间被监视的信号有多长时间读不出来（从来没有读不出来时写“无”，损失无法完整测量时带“· 部分”）。 |
| 消息 | 随事件条目一起冻结的那条消息。 |

发生记录下面有一个**技术时间线**折叠区（标题里写着事件条数和监视会话个数），它列出每一次原始记录下来的边沿（已成立、已复归、不可用、已恢复）和每一次监视会话的分界，并写出事件条目、严重程度、状态变化、时刻和消息。分界那一行说明新的监视会话为什么开始：运行记录继续之后、监视程序重启之后、定义变更之后。分界那一行只画在一条发生记录的第二次及以后的监视会话之前，第一次会话没有。

选中的运行记录还在记录时，它的事件条目证据保持实时：计时每秒走一格，证据和这条运行记录的索引行每两秒重读一次，因此终态不用按刷新就会出现。

## 这份档案不做的事 {#what-the-record-does-not-do}

它不把记录下来的行做成表格显示：数据记录要在图表上看，或者从 CSV、XLSX 导出里看。它不重新判定任何东西：那些判据是这次运行冻结下来的结果，图表上的带状区域只是今天配置提供的参照，从来不是结论。而且除了附注、标注和文档之外，它不改动这次运行记录的任何东西。
