# 判定

> 用来判一次运行合格与否的那些判据、一条判据的每一个字段、每一种结果对这次运行意味着什么，以及这些结果怎么折成一个结论。

一份**判定**是一组可复用的合格/不合格判据。每一条判据在这次运行的某一个窗口里监视一条可读通道，把它记录下来的采样点对着一个固定范围、或者围绕另一条通道的公差来判；每一条都以它自己的一个结果收尾，而这次运行的结论就是它们折出来的东西。判定引擎是在数据记录记下来的那些行上实时判的，因此一条判据的通道和它的参考通道都必须是这个流程数据记录里的列：运行记录文件证明的是当时判了什么。判定住在 Process > 模型 > 某个模型 > 设定 > **判定**下面，需要**编辑配方与判定**权限。

## 判定文件夹 {#the-evaluations-folder}

选中**判定**那一行会打开文件夹页面（“用来判一次运行记录合格与否的判据。判定读取过程通道。”），一份一张卡片，按名称排；点一张卡片就打开它，那个叉则把它删掉。一份都没有时，页面写着“还没有判定。添加一个。”

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

## 判定的页面 {#the-evaluations-page}

标题栏带着名称、那一行“用来判一次运行记录合格与否的判据。”，以及一枚数出判据条数的小药丸。每一个字段都自动保存，每一次编辑都会重画被选中判据的预览。

### 定义 {#definition}

| 字段 | 是什么 | 取值 / 默认 |
| --- | --- | --- |
| **名称** | 这份判定在树里、在一个流程的判定选择框里，以及在一张操作面板的立即判定选择框里叫什么，也是它在每个单元 `LastRun.Evaluations` 下面的文件夹（见[名称就是地址](#names-are-addresses)）。离开这个字段时生效，经由那个事先说明有多少引用会跟着移动的重命名；空名称会被拒绝。 | 自由文本；创建时是 `判定 <n>`。 |
| **附注** | 给读它的人看的自由文本。 | 默认为空。 |

在这两个字段下面，卡片会指出这份判定或它的某条判据的名称读起来和另一个的一样，这是已发布的版本可能保存过的情况（见[名称就是地址](#names-are-addresses)）。

### 这次运行记录怎么判 {#how-the-run-is-judged}

这张卡片按引擎自己的顺序把它施加的那次折叠写出来：

- **不合格**：只要有一条判据不通过。
- **无法判定**：没有一条不通过，但有一条判不了。
- **合格**：只有每一条都通过时才是。

“严重程度不改变这些。它是对着流程的中止门限来读的，只决定一次不通过是否同时把运行记录就此结束。”这张卡片还会在运行之前就发出警告：“有 1 条判据按当前配置判不了，因此运行记录会以‘无法判定’结束。”（或者“有 `<n>` 条判据按当前配置判不了……”），而在没有东西引用它时写着“这个模型还没有流程按这个判定来判。”

## 判据列表 {#the-criteria-list}

这个列表的标题是**判据**，它的**判据**按钮在这个模型第一条可读通道上添一行（锚定为整次运行记录，方式为整个窗口，一个两侧都不设限的固定范围，严重程度为重大，没有名称）并把它选中。点一行就在**判据**那一栏里打开它；什么都没选中时，那一栏写着“选中一条判据，就能在一个地方编辑它的全部内容，每个字段决定什么也写在旁边。”这个列表把整条判据都带上，宽过面板时可以横向滚动。

| 列 | 装着什么 |
| --- | --- |
| **名称** | 这条判据的名称，可以就地编辑。离开输入框时生效，经由和那一栏的**名称**字段相同的重命名；被拒绝时在状态栏里说明。 |
| **通道** | 被判的那条可读通道。 |
| **锚定** | 整次运行记录、时间窗口或曲线段，每一个名字旁边都带着它所判那一段的形状，后果写在悬停提示里。 |
| **窗口** | 这个锚定所需要的那两项设置：曲线段锚定是**段**和**稳定**，时间窗口锚定是**从**和**到**，整次运行记录的锚定写“整次运行记录”。 |
| **方式** | 整个窗口或单个采样点，各带它的形状。 |
| **限值** | 固定范围或围绕设定值，各带它的形状。 |
| **范围** | 固定范围写**最小**和**最大**（“留空则这一侧不设限”）；相对限值写参考通道和 **±** 公差。 |
| **严重程度** | 轻微、重大或严重。 |
| **结果** | 这条判据给这次运行贡献什么（“不合格即判这次运行记录失败”“不合格即判失败并停止运行记录”“无法判定”），整句话写在悬停提示里。 |
| 行上的动作 | **删除**问“删除判据”：那个名称（没有名称时用通道的名称），“这会把这条判据从判定里删掉。” |

## 一条判据的全貌 {#the-criterion-in-full}

那一栏开头是一张预览：被选中判据的范围和它所判的那一段，画在声明出来的坐标轴上，附近没有任何采样点（一块配置屏幕背后没有运行）。固定范围按这条通道的工程值画出来，两侧各留出足够放下一次不通过的余地；相对范围画成相对参考通道的偏差，参考通道就是零那条线。什么都画不出来时（没有设限值、没有选参考），画框会说明原因，而不是空在那里。它下面，每一个字段都立在一句固定的图例上面，而在答案随录入内容变化的地方，还写出当前生效的值的效果。效果那一行里的数字都用工作站的数字格式写（[语言与格式](settings-localization)），每个数字有几位就写几位：范围的边界或公差最多写到它的字段显示的六位小数，时间不到一秒时用毫秒，一秒起用秒。

| 字段 | 是什么 | 取值 / 默认 | 效果那一行 |
| --- | --- | --- | --- |
| **名称** | “凡是显示它结果的地方，都用这个名称称呼这项检查。”留空时，报告上以及这条判据在 `LastRun` 下面的地址里，都退回到用通道来称呼；这一行还没有命名之前，那一栏用 `判据 <n>` 作自己的标题。 | 自由文本；创建时为空。 | 生效这个名称会连带什么，就像每个重命名字段所说的：有多少引用会移动，或者一个都不动。 |
| **通道** | “被判的读数。它必须是这个流程的一个数据记录列。” | 这个模型的那些可读通道；创建时是第一条。 | |
| **锚定**（窗口） | “这条判据判的是运行记录的哪一段。” | **整次运行记录**（默认）、**时间窗口**、**曲线段**。 | 整次运行记录：“判整条运行记录。它不需要配方。”时间窗口：“在自运行记录开始起算的两个时刻之间判。”曲线段：“在配方处于该曲线段期间、延时之后判。暂停会把它延长。” |
| **曲线段（从 0 开始）**和**稳定等待（ms）**（曲线段锚定） | “判配方的哪一个曲线段，以及进入该段之后等多久窗口才打开。” | 整数；默认都是 0。两个字段都不接受负数：输入会被拒绝，字段下面的附注会写出来，之前的值回来。 | “随第 1 段一起打开。”或者“进入第 1 段 2 秒 之后打开。” |
| **从（ms）**和**到（ms，0 = 运行记录结束）**（时间窗口锚定） | “自运行记录开始起算的两个时刻，窗口就在它们之间。” | 毫秒；默认都是 0。到 = 0 表示直到运行结束；否则“到”必须晚于“从”。 | “从 5 秒到运行记录结束。”“从 5 秒到 30 秒。”，或者“结束时间等于或早于起始时间，因此窗口是空的。” |
| **方式** | “结论建立在那一段中的多少内容之上。” | **整个窗口**（默认）、**单个采样点**。 | 整个窗口：“窗口里的每一个采样点都必须通过。”单个采样点：“只由窗口里最后一个采样点决定。” |
| **限值**（限值那一块） | “限值取什么形式，下面的字段也就问什么。” | **固定范围**（默认）、**围绕设定值**。 | 固定范围：“一个固定的工程值范围。任何一侧都可以不设限。”围绕设定值：“围绕另一条通道的范围，取同一行上的采样值。” |
| **最小**和**最大**（固定范围） | “读数必须落在其间的工程值。某一侧留空则该侧不设限。” | 数字或者留空；创建时两边都空。 | “没有设置限值，因此每个读数都算通过。”“20 及以上通过。”“80 及以下通过。”“在 20 到 80 之间通过。”，或者“最小值高于最大值，因此这判不了，运行记录会以‘无法判定’结束。”，这也正是这一行下面结果那一块所写的 |
| **参考**和 **± 公差**（相对） | “读数对着哪一条通道来量，以及可以离它多远。” | 这个模型的一条可读通道和一个数字；创建时是没有参考、公差为 0。 | “在 Setpoint 的 ±0.5 以内通过。”或者“请选择公差围绕哪条通道来量。” |
| **严重程度** | “对着流程的中止门限来读。它同时决定报告上的强调程度。” | **轻微**、**重大**（默认）、**严重**。 | |
| **结果** | 这条判据产出什么，以及那对这次运行意味着什么。 | 只读。 | 见下。 |

### 结果那一行说什么 {#what-the-result-says}

| 那一行 | 细节 | 什么时候 |
| --- | --- | --- |
| “不合格即判这次运行记录失败” | “一次失败会把这次运行记录判为不合格。”或者，当确实有流程跑这份判定时，“一次失败会把这次运行记录判为不合格。运行记录仍会跑完，因为没有流程在这个严重程度上中止。” | 跑这份判定的流程里，没有一个在这条判据的严重程度上中止。 |
| “不合格即判失败并停止运行记录” | “一次失败会把这次运行记录判为不合格并就此结束，因为‘`<procedure>`’在这个严重程度上会中止。” | 跑这份判定的某个流程，其不合格中止门限等于或低于这个严重程度。 |
| “无法判定” | “按当前配置无法判定，因此这次运行记录会停在‘无法判定’。”后面跟着原因。 | 下面那些原因之一成立。 |

一条判据判不了的那些原因，按引擎自己的顺序在配置时就问出来：“它没有监视这个模型的任何通道。”；“它监视的通道，没有被执行它的那个流程的数据记录记下来。”；“它没有跟随这个模型的任何参考通道。”；“结束时间等于或早于起始时间，因此窗口是空的。”；“它的限值不完整，或者上下颠倒。”；“参考通道没有被执行它的那个流程的数据记录记下来。”那两条关于数据记录的原因，只对跑这份判定的那些流程去问；还没有被任何流程选用的判定只是没写完，不是写错了。

## 判据怎么折成一个结论 {#how-criteria-fold-into-a-verdict}

一个活动窗口内记录下来的每一行都被归类一次：**已判**、**不可用**（值缺失或者质量不良）或者**无效**（一个质量良好但不是有限数字的值；一个良好的 `NaN` 仍然是可审计的原始数据，但它证明不了一条数值判据）。固定限值需要被监视的那个值；相对限值需要同一行上被监视的值和参考值。已判采样点、越界采样点、不可用采样点和无效采样点这几个计数，以及冻结下来的受影响通道集合，都按判据记录下来，而且也可以在这个单元的 `Procedure.*` 点位下面实时读到（见[单元地址空间](process-addresses)）。

每个结果还会记下测到了什么：窗口里所看通道最后一个被评估的值（单个采样点方式下就是被判的那个采样），被评估的最小值和最大值，以及最差偏离，也就是计入的采样点里越过限值最远的那个距离（有采样点被评估而且没有一个越限时，它是 0）。不可用和无效的行从来不算，所以一个什么都没评估到的窗口这些都不记。早先版本写的运行记录文件没有测量值，读出来是空的。

每个结果还会留下它判过的那一段运行：方式、锚定、时间窗口的开始和结束、曲线段以及它的稳定等待。以后再打开这次运行，仍然能看出判的是哪一段；运行档案和 PDF 报告里的证据都以它开头（见[判过的判据](histories-record#judged-criteria)）。早先版本写的运行记录文件没有留下它，证据里只有那几个计数。

结果对证据是严格的。**整个窗口**方式下，任何一次已判的越界都证明**不合格**；否则，一行不可用或无效、一次被打断的监视或者一个空窗口，都会让这条判据变成**无法判定**；只有完整的、都在范围内的证据才让它**合格**。**单个采样点**方式只由这个窗口最后一个活动采样点决定，它结果里的计数、最差偏离和受影响通道也都只属于这一个采样点；最小值和最大值仍然覆盖它看过的整个窗口。时序流程按每一个循环重新锚定每一条判据，并数出不通过的循环数。这次运行的结论按顺序折叠：一次被中止的运行，或者任何一条不合格的判据，都让它**不合格**；否则任何一个无法判定的结果都让它**无法判定**；全部合格才让它**合格**；没有判定的运行以没有结论收尾。只有一次确认过的不合格才触发流程的中止门限或者那个不通过循环的计数。

## 名称就是地址 {#names-are-addresses}

每个单元都把它最近一次运行记录的结果发布在 `Process.<Model>.<Unit>.LastRun.Evaluations.<Evaluation>.<Criterion>` 下面（见 [LastRun](process-addresses#lastrun)），所以判定的名称和每条判据的名称（没有名称的判据则是它所看通道的名称）都是地址段，也就是规整之后的名称：“Soak check”就是 `Soak_check`。重命名其中任何一个，都会移动这些地址，并改写写过它们的表达式、脚本和画面，就像模型的每一次重命名一样；重命名没有名称的判据所看的通道，也会移动它。

两个读起来一样的名称会对应同一个地址，而这个地址说不清自己装的是哪一个结果，所以：

| 情况 | 会发生什么 |
| --- | --- |
| 某个名称会让模型的两个判定、或这份判定的两条判据得到同一个地址段（不区分大小写） | 被拒绝，并指出这个地址段，以及已经对应它的是谁。 |
| 这份判定的两条判据都没有名称，而且看同一条通道 | 允许，因为新判据一开始就是这样；在其中一条有名称之前，两个结果都不能在 `LastRun` 下面读到。 |
| 早先版本保存的模型已经有两个这样的名称 | 保持原样，也按原样保存。共用的地址什么都读不到，定义卡片会说明：“它的地址段 Soak_check 与 Soak Check 相同，因此 Logic 读不到其中任何一个最近一次运行的结果。请重命名其中一个。”或者“判据 Oven air, Oven Air 共用地址段 Oven_air，因此 Logic 读不到其中任何一个最近一次运行的结果。请给每个判据起一个各自的名称。” |
| 复制带有这类名称的模型 | 副本按来源的样子保留它们。 |

## 一份判定在哪里被用到 {#where-an-evaluation-is-used}

| 界面 | 它拿这份判定做什么 |
| --- | --- |
| 一个流程的**判定**那一段 | 判这个流程的每一次运行；**不合格达到以下程度即中止** 那个选择框随它一起到来。那一段的文字写着“判定 4 条判据，重大 级的不合格会中止运行记录。”或者“……，不合格也不会中止运行记录。”一个有判定却没有数据记录的流程通不过校验。见[流程](process-procedures)。 |
| 一张操作面板的**单条命令**卡片 | **立即判定**通过一份数据记录记录一行，并按这份判定去判它；结论记进历史。这份判定的那些通道必须是所选数据记录里的列。 |
| 标签命令 | 一个标记可以读某条判据的名称、通道、限值、严重程度、结果、错误、窗口时刻、采样点计数、受影响通道或者最大越界量，针对一个明确指定的循环。见[动作](process-actions#markers)。 |
| 报告 | 判据那一节把每一条判据的结果印出来，强调程度由它的严重程度决定。 |
| Logic | 每个单元的 `LastRun.Evaluations` 读出这个单元最近一次运行记录里每条判据的结果（结果、测量值、极值、限值、最大越限、不通过的循环），供完成时触发的 Logic 动作、画面或报警使用。见 [LastRun](process-addresses#lastrun)。 |

## 删除判定 {#remove-evaluation}

**删除判定**在选中这份判定时立在详情栏的危险组里，也在它的右键菜单里，还是文件夹页面卡片上那个叉。它先问一次（“删除判定”，“这会删除这个判定及其判据。”）。每一个按它来判的流程都把它的判定引用清空，它的那些运行也就以没有结论收尾。它需要编辑配方与判定，在工程锁定和运行时停止之下变灰。

## 一份判定不做的事 {#what-an-evaluation-does-not-do}

- 数据记录没有记录的东西它不判，运行或快照之外的东西它也不判。
- 它没有表达式判据：一条判据就是一条通道上的一个范围或者一个公差。
- 它在各个单元之间没有任何差别：一套限值服务于这个模型的每一个单元。
- 它自己不结束任何运行。一次不合格会不会中止这次运行，是流程的不合格中止门限说了算，对着这条判据的严重程度来读。
