# 校准

> 一个点位的校准环节、一步一步的两点法助手、“应用”做什么又拒绝什么，以及“校准点位”权限单独能开放什么。

**校准**是一个数值点位[数值转换链](connector-value-pipeline)里的第二个线性环节：`calibrated = scaled × Angular + Linear`，排在量程换算之后、无效读数、限值和小数位之前。它之所以存在，是为了让一次对着标准器做出的校前/校后修正能被记下来，而不用去动量程换算里那套算法；它也是拥有**校准点位**而没有**配置 Connector** 的角色唯一能改的那个环节。量程换算和校准两个环节都带一个**两点法**助手，用两个参考点算出那一对系数。

## 这个环节 {#the-stage}

在[点位](connector-tags#the-conversion-card)页面的“转换”卡片上，这个环节写着**校准**加它的勾选框（默认关）、**斜率（×）**（默认 1）、**截距（+）**（默认 0）、头部的**两点法**按钮，以及右边它当时的结果：环节生效时是 `= value`，被跳过时是 `→ value`。设备表格把同一对系数显示为**校准 ×** 和**校准 +**，把结果显示为**校准后**，并且只对“配置 Connector”可编辑。

斜率填 0 会在打字的地方就被拒绝：“校准系数填 0 会把每一次读数都变成零。请填写要乘的系数（填 1 表示保持原值）。”

### 一次环节编辑是怎么保存的 {#how-a-stage-edit-is-saved}

量程换算和校准的编辑不搭设备那趟带延迟合并的自动保存。每一次确认（勾选框、任一字段）都立刻写下去，而且只限于这个环节：只有那个点位的那个环节被复制到已存下来的设备上，所以只做校准的编辑绝不会顺手把一份还没保存的“配置”草稿一起带走，而同时跑着的整台设备自动保存也绝不会盖掉这次修正。被拒绝或失败的确认会从数据库重新载入这个环节，所以被驳回的值绝不会赖在页面上；原因落在操作记录条里（“环节编辑没有保存：……”）。

### 谁可以改哪个环节 {#who-may-edit-which-stage}

| 环节 | 手填字段和勾选框 | 两点法的“应用” | 被拒绝时的提示 |
| --- | --- | --- | --- |
| **量程换算** | 配置 Connector | 配置 Connector | “编辑量程换算环节需要‘配置 Connector’权限。” / “应用量程换算的校正需要‘配置 Connector’权限。” |
| **校准** | 校准点位或配置 Connector | 校准点位或配置 Connector | “编辑校准环节需要‘校准点位’或‘配置 Connector’权限。” / “应用校准的校正需要‘校准点位’或‘配置 Connector’权限。” |

除了权限之外，有运行占住工作站时两个环节都拒绝（“编辑这个环节之前，请先结束正在进行的 Process 操作。” / “应用这次校正之前，请先结束正在进行的 Process 操作。”），运行时已停止时也拒绝（“运行时已停止”）。权限是在编辑被确认时再读一次的，不只是在字段被画出来的时候。

## 两点法助手 {#the-two-point-assistant}

按一个环节头部的**两点法**，助手就在这个环节下面展开，标题是**两点法校正**。它开着的时候从不去改点位；在你按下“应用调整”之前什么都不变。第一行说明一次采集读的是什么：“采集用的是当前量程换算的输出，在校准、限值和小数位之前。”或“采集用的是当前校准的输出，在限值和小数位之前。”对永远不能应用这个环节的角色，这个按钮根本不画出来。

### 第 1 步：两个参考点 {#step-1-two-reference-points}

两个字段组，**第 1 点** 和**第 2 点**，每个都有**期望值**（这个环节在这个参考点上应该输出的值）和**读数**（它今天在那里输出的值）。两个都要填成有限的数字；别的东西会被标上“请输入一个有限数。”你还在琢磨的时候可以先留空。顺序无所谓，但两个期望值必须不同，两个读数也必须分得开。

### 第 2 步：采集或手填读数 {#step-2-capture-or-type-the-reading}

**采集**把这个点的“读数”填成此刻这个环节的实时输出，并打上时间戳（“已采集 14:02:33”）；之后它读作**重新采集**。最新一次读数的通信质量不算良好时（“需要一次通信正常的实时读数。”），或者这个环节没有有限的数值时（“所选环节没有有限的实时数值。”），采集被拒绝。手填一个读数会清掉这个点的采集时间戳。

两个读数都钉在它们被取下来那一刻这个环节的系数上。如果那些系数在你手底下变了（有人改了字段，另一个窗口应用了一次调整），下一次采集或手填的读数就开始新的一对：另一个点的读数和两个时间戳都被清掉，草稿写着“第一次读数之后环节设置发生了变化。请重新采集或重新输入两个读数。”

### 第 3 步：看结论和预览 {#step-3-read-the-verdict-and-the-preview}

四个值都在了以后，助手会在这个点位的一份用完就扔的副本上评估这份草稿，所以预览跑的是生产环境里那套算法。成不了一次安全修正的草稿，会在这两个点旁边说明原因：

| 提示 | 原因 |
| --- | --- |
| 请把两个点的期望值和读数都填上。 | 有字段留空。 |
| 两点法修正需要一个数值点位。 | 这个点位不是数值类型。 |
| 所有点的数值都必须是有限的数字。 | 有一个值是无穷或者不是数字。 |
| 两个期望值必须不同。 | 期望值相等，定不出一条直线。 |
| 两个读数相等，或者太接近，分不安全。 | 两个读数相差不超过八个浮点步长。 |
| 两点之差太大，算不安全。 | 两点相减溢出了。 |
| 选中的环节当前的系数无效。 | 这个环节当前的斜率或截距不是有限的。 |
| 这两个点算出来的修正系数超出了支持的范围。 | 修正本身不是有限的。 |
| 把这次修正和当前环节合成之后超出了支持的范围。 | 合成出来的那一对不是有限的。 |
| 得到的环节无法安全地反算。 | 合成出来的斜率是 0，或者小到不能拿来做除数，那会让写入变得不可能。 |
| 这个候选值没能走完点位的转换链。 | 预览没能产出有限的值。 |

一份有效的草稿会显示**校正预览**表：每个参考点各一行，再加一行**实时**读数，列出调整**之前**的环节输出、调整**之后**的输出、**期望值**，以及（只对量程换算）**最终**，也就是走完后面每一个环节之后的值。点位还没有读数时，“实时”那一行显示短横。表里的每个数字都按“转换”卡片写一个环节的方式来写，用工作站的数字格式（[语言与格式](settings-localization)）：值有几位小数就写几位，最多六位；Float 点位则写 float 存的那个值（239.05，而不是 239.050003）。采集到的读数填进它的“读数”框时用同样的数字，但不加分组记号，这样框里显示的数字读回来还是同一个数。

助手算的是什么：一次修正，斜率为 `(Expected2 − Expected1) ÷ (Read2 − Read1)`，偏移为 `Expected1 − slope × Read1`，作用在这个环节当前输出之上，然后与这个环节当前的那一对合成，得到取而代之的候选斜率和截距。就这件事而言，关着的环节按恒等的那一对（1, 0）算，而“应用”会把这个环节打开。

### 第 4 步：应用或取消 {#step-4-apply-or-cancel}

**应用校正**只有在每个字段都有效、没有采集错误、预览有效，而且角色和工作站都允许时才可用；否则原因会打在按钮上方。按下它，就把候选的那一对写进这一个环节，打开这个环节，报告“已对‘Temperature’应用校准的两点法校正。”（或者“已对……应用量程换算……”），然后收起助手。在这些情况下它拒绝，并把草稿留着让你重试：预览之后这个环节变了（“预览之后环节设置发生了变化。请复核这两个点后重试，什么都没有应用。”）、存下来的设备在这份草稿之外被改过（“已保存的环节设置在本草稿之外被改动了。请重新加载后重试，什么都没有应用。”）、点位或它的设备已经不存在，或者工作站拒绝改动。执行期间显示“正在应用…”；每一句拒绝都写着“什么都没有被应用”，原来的系数原封不动。

**取消**收起助手并丢掉草稿。选中另一个点位同样会收起它；草稿只在它的助手开着的时候存在。

## “校准点位”单独能开放什么 {#what-calibrate-tags-allows-on-its-own}

一个有“校准点位”而没有“配置 Connector”的角色，看到的整个 Connector 都是只读的，只为校准开了一个口子：

- 在点位页面上，校准环节的勾选框、它的斜率和截距，以及带“应用”的两点法助手都是活的。其余每一个字段都不可用，“常规”卡片上方带着说明“更改 Connector 需要“配置 Connector”权限。”，量程换算那几个字段则把量程换算那句提示当作它们的提示文字。
- 设备表格里的“校准 ×”和“校准 +”单元格对这个角色不可编辑；校准走点位页面。
- 创建、启用、禁用、删除、写入、设备发现和替换这些命令一个都不画出来。

“校准点位”是“配置 Connector”的子集：持有“配置”的角色在这里什么都有。权限的完整目录在[权限](users-permissions)里。
