# 数据记录

> 一个模型的记录配置：每个间隔一张快照、它采集哪些通道，以及每一次运行都遵循的列顺序。

一份**数据记录**是这个模型里一份可复用的记录配置。它声明一次运行写下什么：每个间隔一张快照，带着这份数据记录列出的每一条通道，每一个值都配上它被读到时的质量（良好或不可用）。它不声明这个模型怎么画自己：图表是仪表画面上的一个组件，不是这里的一项设置。数据记录住在 Process > 模型 > 某个模型 > 设定 > **数据记录**下面，需要**编辑配方与判定**权限。

一个模型要几份数据记录就有几份。一个[流程](process-procedures)通过它的**记录**那一段指向其中一份，而正是那处引用才让一次运行真的去记录：没有数据记录的流程一个采样点都不记，也就不能带判定，因为判定是在记录下来的行上判的。一张操作面板上的**快照**和**立即判定**命令也通过一份数据记录来记录，一次一行。

## 数据记录文件夹 {#the-datalogs-folder}

选中**数据记录**那一行会打开文件夹页面（“可重复使用的记录配置：一个周期性的快照间隔，以及引用它的每一次运行记录所采集的通道。”），一份一张卡片，按名称排；点一张卡片就打开它，那个叉则把它删掉。一份都没有时，页面写着“还没有数据记录。添加一个。”

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

## 数据记录的页面 {#the-datalogs-page}

标题栏带着名称和那一行“记录什么：按配置的间隔，周期性地拍一张包含所有选定通道的快照。”每一个字段都自动保存。

### 记录 {#recording}

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **名称** | 这份数据记录在树里、在一个流程的记录选择框里，以及在一张操作面板的快照选择框里叫什么。 | 自由文本；创建时是 `数据记录 <n>`。 | 给那一行重命名。 |
| **快照间隔（ms）** | 多久记录一张快照。字段下面那一行写着“多久记录一张快照。一次运行记录最快是 50 ms。” | 一个不小于 50 的整毫秒数；默认 1000。更短的值会在字段下面被拒绝（“请输入不小于 50 的数字。”），输入框退回原值。 | 决定每一次用这份数据记录的运行和快照的记录速率。 |

### 通道 {#channels}

“运行期间要记录的模型通道。它们定义了运行记录的各列。”这张卡片的标题带着**通道**，按它就在这个模型里还没有哪一行记录的第一条可读通道上加一列；表格里记录的每一列一行。这样的通道一条都不剩时，**通道**保持变灰，提示文字说明原因：“这个模型没有可读的通道可以记录。”或者“模型的每一个可读通道都已经在这里记录了。”

| 列 | 是什么 | 取值 / 默认 |
| --- | --- | --- |
| **通道** | 这一列记录的那条模型通道，写作 `Ch<number> · <name>`。 | 只提供可读的通道（只读和读写）：只写的通道从不被采样，因此建在它上面的一列会一直空着。每一行的选择框提供其他行都没有记录的可读通道，因为同一条通道放在两行上，就是运行记录的同一列挂在两个标题下。 |
| 行上的动作 | **把通道上移**、**把通道下移**（两端保持变灰）、**删除**（问“删除列”：那条通道的名称，“这会把这一列从数据记录里删掉。”）。 | |

行的顺序就是列的顺序：运行记录文件、CSV 和 XLSX 各表都跟着它走，因此那两个箭头决定了导出长什么样。被工作站拒绝的移动会把这一行放回原处。

这里不声明别的东西。每一列的名称、工程单位、类型和图表墨色都来自[通道](process-channels)本身。给一条通道重命名，会连同这个模型里其他每一处引用一起改写这处引用；而删掉一条通道，会在一次数清有多少东西要走的确认之后，把它这一列扫掉。

## 一份数据记录在哪里被用到 {#where-a-datalog-is-used}

| 界面 | 它拿这份数据记录做什么 |
| --- | --- |
| 一个流程的**记录**那一段 | 在这个流程的每一次运行期间通过它来记录。那一段的文字说清这意味着什么：“每 500 ms 记录 6 个通道”，时序流程还加上“……，每个通道约 180 个采样点。”没有数据记录的流程读作“什么也不记录：这次运行记录不留下数据记录。” |
| 一张操作面板的**单条命令**卡片 | **快照**通过选中的数据记录记录一行，在历史里作为一次生下来就结束的即时运行；**立即判定**记录一行，并按一份判定去判它，前提是那份判定的通道都在这份数据记录里。 |
| 一份判定 | 只判这个流程的数据记录记录了的通道：某条判据的通道（或者它的参考通道）不是那份数据记录的一列时，它就判不了，判定的页面会这样写。 |
| 一次运行期间投入的事件条目 | 读记录下来的那些列，因此这份数据记录没有记录的通道，在运行期间对它是不可用的。一个流程在这份数据记录漏掉的通道上投入了事件条目会被拒绝，投入了事件条目却什么都不记录的流程也一样。 |

## 删除数据记录 {#remove-datalog}

**删除数据记录**在选中这份数据记录时立在详情栏的危险组里，也在它的右键菜单里，还是文件夹页面卡片上那个叉。它先问一次（“删除数据记录”，“这会删除这个数据记录以及它所记录的各列。”）。每一个曾经通过它记录的流程都把它的记录引用清空，然后照常活着。它需要编辑配方与判定，在工程锁定和运行时停止之下变灰。

## 一次运行拿它做什么 {#what-a-run-does-with-it}

[启动](process-runs)把这份数据记录的通道布局冻结进运行记录文件：那些列，按顺序，每一列带着它的编号、它的名称、在这个单元上当时生效的别名、它的工程单位和它解析出来的图表墨色。这次运行在此后每一次编辑这份数据记录之后仍然保留它们，甚至在这个模型本身被删掉之后也保留。每一拍记录一张应用级的快照，装着全部的列：不可用的信号源或者转换不了的值存成一段标为不可用的空缺，而一个正确收到的值，例如 `NaN` 或者一个工程哨兵值，仍然是良好。生命周期其余的部分在[运行记录与备注](process-runs)里；浏览和导出记录下来的东西则在[历史](histories)里。

## 一份数据记录不做的事 {#what-a-datalog-does-not-do}

- 它什么也不画。一个模型怎么把它记录的东西显示出来，那是一张仪表画面，或者一张操作面板的通道卡片。
- 它自己什么也不记录。没有流程引用、也没有快照触发的数据记录，一行都不记。
- 它没有按单元的变体：每一个单元都记录同样那些列，在它自己的绑定上记。
- 它不过滤、不平均、也不压缩：每个间隔一行，每一列，读到什么样就是什么样。
