# 点位

> 点位页面逐张卡片：标题栏和命令、常规、带每个驱动各自字段的“信号源”、转换、带写入字段的实时数值，以及带“全部替换”的“被谁使用”。

一个**点位**就是一台设备上的一个可寻址的点：总线上的一个地址、一种数据类型，以及把原始读数变成工程值的那条转换链。在一台设备下面选中一个点位行，或者在设备“点位”表格的某一行上按“打开”，就能打开它的页面。“查看 Connector”能读它，“配置 Connector”能改它，“校准点位”只能改校准环节。

## 标题栏 {#the-header}

一个实时圆点（点位有数值时是绿色，数值是替代值、限值环节报了故障或者读数停止更新时是琥珀色，否则是灰色；工作站不读取的点位，也就是被禁用的点位，或者设备被禁用、挂在已禁用线路下面、还没有填写主机的点位，不管上次显示的是什么都是灰色）、点位的名称，下面是这个点位的地址 `Connector.<Driver>.<Folders…>.<Device>.<Tag>`，也就是 Logic 和仪表画面书写的那个。再下面，在用得上的时候：一条带校验提示的提醒（名称留空、地址缺失、系数为 0），以及红色的最近错误。点位的设备未连接期间，一条平和的提示指向设备，而不重复连接失败：“此点位经由设备 Furnace，该设备未连接。原因见设备页面。”

## 命令栏 {#the-command-bar}

| 命令 | 作用 | 何时置灰（情况） | 何时不画出来（角色） |
| --- | --- | --- | --- |
| **复制数值** | 把工程值按显示的样子复制到剪贴板（“已把‘Temperature’的数值复制到剪贴板。”）。 | 从不。 | 从不。 |
| **启用** | 把点位放回采集和实时地址空间。 | 已经是启用的，或者工作站拒绝改动。 | 没有“配置 Connector”权限时。 |
| **禁用** | 把点位从采集和实时地址空间里撤下来；设备继续轮询它的其他点位。 | 已经是禁用的，或者工作站拒绝改动。 | 没有“配置 Connector”权限时。 |
| **删除点位**（危险色，靠右） | 先问“要删除‘Temperature’吗？这会把它从‘Furnace’里移除。此操作无法撤销。”，然后删除并选中那台设备。 | 工作站拒绝改动。 | 没有“配置 Connector”权限时。 |

每张卡片都按 [Connector](connector#the-detail-panel) 里讲的方式自动保存。对没有“配置 Connector”权限的角色，“常规”和“信号源”两张卡片保持不可用，上面有一句说明“更改 Connector 需要“配置 Connector”权限。”

## “常规”卡片 {#the-general-card}

| 字段 | 它是什么 | 取值 / 默认值 | 影响 |
| --- | --- | --- | --- |
| **点位名称** | 这个点的名称；也是总线标识和地址两者的最后一段。 | 必填。 | 打字时会预告这次重命名要带走多少处引用；确认之后就把它们改写掉：“点位已重命名，更新了 2 处引用。”留空会被拒绝：“点位名称不能为空。”OCPP 的点位名必须以 Meter、Status 或 Transaction 结尾：“OCPP 点位名称必须以“Meter”、“Status”或“Transaction”结尾（例如 Connector1Meter）。” |
| **数据类型** | 内置服务器对外暴露的那个 OPC UA 标量类型。 | Boolean、SByte、Byte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Float、Double、String、DateTime、Guid、ByteString，收窄到驱动能编排的那些；驱动有 Float 时默认 Float，否则取它提供的第一种类型。 | 改它会把依赖它的东西一起对齐：在装不下 NaN 的类型上，NaN 越限处理变成“空值”；在非数值类型上，NaN 策略退回直通；与类型不相容的仿真信号种类换成该类型的默认种类；Modbus 寄存器类别也随类型跨过位与寄存器的分界。“转换”卡片的形状也跟着它变。 |
| **访问** | 工作站是读、是写，还是两样都做。 | 只读、只写、读写；默认只读。OCPP 和 LoRaWAN 只提供只读。Matter 点位只对驱动能改变的值提供写入，否则在字段下面说明原因（[手工创建的点位](driver-matter#a-tag-made-by-hand)）。NI-DAQmx 点位提供其测量允许的访问方式（[测量](driver-ni-daqmx#measurements)）。MIB 声明为只读的标准对象上的 SNMP 点位只提供只读，并在字段下面说明原因（[数据类型与访问](driver-snmp#data-types-and-access)）。File 点位在其设备允许写入之前只提供只读，文件信息始终只读（[点位读取什么](driver-file#what-a-tag-reads)）。Database 点位只有在其访问方式允许写入之后，才显示写入的方式（[写入](driver-database#writing)）。 | 读写和只写会在“实时数值”卡片上画出写入字段；只写的点位不被轮询，也不计入设备健康状态，而且因为工作站从不读它，它也没有读取失败时的策略。 |
| **单位** | 工程单位，自由文本。 | 空。 | 显示在每个环节结果和工程值旁边，以及任何显示这个数值的地方。 |
| **轮询间隔（ms）** | 按点位覆盖设备的轮询间隔。 | 0（用设备的默认值）；负值按 0 存下来。 | 对 Mitsubishi MC、BACnet、OCPP、LoRaWAN 和 MQTT 隐藏，它们不理会它。 |

## “信号源”卡片 {#the-source-card}

“这个点位的值从哪里来，以及最近一次的原始读数。”字段随驱动而变；语义由各驱动页面讲，这里是面板画出来的那份清单。

### 自由文本地址 {#free-text-address}

靠你打进去的一个记号来寻址的驱动只显示一个字段，标签按驱动而定：**节点 ID**（OPC UA）、**符号**（Beckhoff ADS）、**设备地址**（Mitsubishi MC）、**控制器标签**（Rockwell）、**资源路径**（Redfish）、**PI 路径**（AVEVA PI）、**路径**（HTTP）、**主题**或**指标**（MQTT，取决于设备的协议是普通 MQTT 还是 Sparkplug B）、**存储区地址**或**变量名**（Omron，取决于设备的协议是 FINS 还是 NJ/NX 点位（按名称））、**查询**（SCPI instruments）、**物理通道**（NI-DAQmx）、**OID**（SNMP），下面配着这个驱动的提示。对这些驱动来说这个字段是必填的：“这个驱动需要填 节点 ID。”

### 按驱动的定型字段 {#typed-fields-per-driver}

| 驱动 | 字段 |
| --- | --- |
| Modbus TCP、Modbus RTU | **寄存器类别**（线圈（0xxxx）、离散输入（1xxxx）、输入寄存器（3xxxx）、保持寄存器（4xxxx），每一类都带着设备手册的地址给它的首位数字；默认值跟着类型和读写走：只读的布尔是离散输入，可写的是线圈，只读的数值是输入寄存器，可写的是保持寄存器）和**寄存器编号（从 0 开始）**。 |
| Siemens S7 | **存储区**（DataBlock、Merker、ProcessInput、ProcessOutput、Timer、Counter）、**DB 编号**（仅 DataBlock）、**起始字节**、**位（0-7）**（布尔点位）、**最大长度（留空为 254）**（文本点位）。 |
| Rockwell | 在“控制器标签”字段之后的**标签内偏移量（字节，BOOL 为位）**；0 就是标签的开头。 |
| BACnet | **对象类型**（AnalogInput、AnalogOutput、AnalogValue、BinaryInput、BinaryOutput、BinaryValue、MultiStateInput、MultiStateOutput、MultiStateValue）和**实例号**。读的是当前值。 |
| OCPP | **Connector**（充电接口编号，默认 1），配一句说明“把点位命名为 …Meter（电能读数）、…Status（充电接口状态）或 …Transaction（进行中事务的编号）。” |
| Redfish | 在“资源路径”之后的 **JSON 指针（留空为整个文档）**，“例如 /Temperatures/0/ReadingCelsius”。 |
| Matter | **输出（endpoint）**、**Matter 簇**和**属性**排在同一行；簇从 Matter 目录里按名称选。Matter 设备的点位通常来自设备本身，在配对之后或“发现设备”时勾选创建（见[Matter](driver-matter#tags)）；这几个字段是给少见的手工点位用的。 |
| MQTT | 在普通 MQTT 设备上，主题字段之后有**数值路径**（值在 JSON 负载中的位置；留空则读整个负载）、**命令主题**（写入发布到哪里；留空则点位保持只读）和**负载模板**（写入发布的 JSON，在值的位置放 `{value}`）。Sparkplug B 指标一个都没有，见[MQTT](driver-mqtt#tag-addressing)。 |
| Generic serial and TCP | 没有要输入的地址：**取值方式**（请求与应答或监听）、**请求**、**消息过滤条件**、**数值取自**及其所选方式用到的字段、**设备用逗号作小数点**（Float 和 Double），以及会被写入的点位上的**写入消息**和**预期回复**。见 [Generic serial and TCP](driver-generic-serial-tcp#tag-addressing)。 |
| SCPI instruments | 在查询字段旁边：被读取的点位有**应答中的值**（逗号分隔应答中从 1 数起的哪个值属于这个点位；留空读取整个应答），被写入的点位有**写入命令**（写入时发送的内容，在数值所在位置放 `{value}`）。见 [SCPI instruments](driver-scpi#tag-addressing)。 |
| NI-DAQmx | 在物理通道旁边：**测量**以及该测量的字段：以其单位表示的量程（**最小值**和**最大值**）、**端子配置**、**分流电阻**和**分流电阻阻值 (Ω)**、**热电偶类型**、**冷端补偿 (CJC)** 和 **CJC 温度 (°C)**、**计数边沿**、**计数方向**、**初始计数**和**输入端子**，每一个只在测量读取它时才画出来。见 [NI-DAQmx](driver-ni-daqmx#tag-addressing)。 |
| SNMP | 在 OID 下面以只读方式显示：**MIB 名称**，即对象的标准名称及其 MIB 对它的说明（没有时为“无标准名称”），以及**数字 OID**，即每个请求携带的数字。见 [SNMP](driver-snmp#the-oid)。 |
| File | 没有要输入的地址：**读取内容**（一个值、整个文件或一项文件信息），对于值，还有设备格式的字段：**列**和**要读取的行**（CSV）、**要读取的行**和**数值取自**（自由文本）、**JSON 路径**或 **XML 路径**；在允许写入的设备上，还有**写入方式**和**行模板**。见 [File](driver-file#tag-addressing)。 |
| Database | 没有要输入的地址：**读取内容**（**表和列**或**自定义查询**）及其字段：**表**、**值列**和**要读取的行**，加上**键列**和**键值**或**日期列**，或者**查询文本**；写入的点位还有**写入方式**和**写入命令**。见 [Database](driver-database#tag-addressing)。 |
| LoRaWAN | **按 Cayenne LPP 的通道/类型寻址**（勾选框）、**通道 / 报文偏移量**、**LPP 类型码**（打开 LPP 时）、**位掩码（十六进制，留空为不掩码）**、**乘数（留空为不乘）**。 |

### 总线长度与字节序 {#wire-length-and-byte-order}

| 字段 | 哪些驱动显示 | 它是什么 |
| --- | --- | --- |
| **数量（寄存器，留空为自动）** | Modbus，仅文本点位 | 要读多少个 16 位寄存器；留空读 4 个。Modbus 的其他类型宽度是定死的（布尔、Int16 和 UInt16 一个寄存器，Int32 和 Float 两个），所以对它们不画这个字段。 |
| **读取长度（字节，留空为自动）** | Beckhoff、Mitsubishi、LoRaWAN | 字节数；留空就由类型推出来：Boolean、Byte 和 SByte 是 1；Int16 和 UInt16 是 2；Int32、UInt32 和 Float 是 4；Int64、UInt64 和 Double 是 8；String 是 16；其余是 4。 |
| **长度（字符数，留空为 16）** | Omron（FINS，仅 String 点位） | 文本占用的字符数，每个字两个字符，1 到 1998；留空读 16。FINS 的其他类型占用其类型规定的字数，所以不绘制这个字段。 |
| **高字节在前（MSB first，大端序）** | Modbus（数值点位，以及放在寄存器里的布尔点位）、LoRaWAN | 数值的哪一头先上总线；括号里是手册对这一项的写法。Modbus 默认打开，LoRaWAN 默认关闭。Modbus 对文本没有定义字节序，所以 Modbus 的文本点位不提供这一项。线圈或离散输入里的 Modbus 布尔值只是一个位，没有字节可排，所以也不提供。 |
| **高字在前（high word first）** | Modbus（Int32 和 Float 点位） | 两个寄存器组成的值里，哪个 16 位半字在前。默认打开。两个框下面的**数值的字节顺序**用手册里的字母说出两个框合起来的排布：都勾选是 ABCD，取消字的框是 CDAB，取消字节的框是 BADC，都取消是 DCBA。只占一个寄存器的类型（Boolean、Int16、UInt16）没有第二个半字，所以那里不画这个框；LoRaWAN 也不提供，它的负载里没有“字”可以排先后。 |

### 源地址（总线） {#source-address-wire}

Modbus 点位的字段组末尾是**手册中的地址**：点位在设备手册所印记法里的位置，即类别的首位数字后接从 1 起数的寄存器。输入寄存器 0 读作 30001，放在那里的 Float 读作 30001 到 30002，超过 9998 的寄存器用六位（保持寄存器 9999 读作 410000）。在**寄存器编号（从 0 开始）**里输入的编号仍是请求里带的那个编号；见 [Modbus TCP](driver-modbus-tcp#tag-addressing)。

除仿真之外的其他每个点位，字段组的末尾都有一段只读的预览，显示驱动实际收到的那个地址，由上面那些字段加上设备的连接字段拼成：S7 字节是 `DB1?0`，Rockwell 标签是 `Program:Main.Counter?0`，ADS 符号是 `MAIN.fValue?4`，BACnet 对象是 `0,3`，OCPP 是 `ocpp://<charge point>/<connector>`，Redfish 是 `<resource>#/Temperatures/0/ReadingCelsius`，LoRaWAN 是 `<DevEUI>/<channel>/<lpp>?quantity=<n>`，Matter 是 `<endpoint>/<cluster>/<attribute>`，普通 MQTT 点位是 `<topic>?path=<value path>&command=<command topic>`，Sparkplug B 点位是指标名称；Generic serial and TCP 驱动的监听点位是 `listen?extract=position&start=5&length=6`；Omron 的 FINS 点位是 `D100`（文本是 `D200?16`），NJ/NX 点位是 `Motor.Speed?0`；读取应答中第三个值的 SCPI 点位是 `ask=READ?&field=3`；NI-DAQmx 电压输入是 `cDAQ1Mod1/ai0?measurement=voltageInput&terminal=diff&min=0&max=10`；写作 `upsBatteryStatus.0` 的 SNMP 点位是 `1.3.6.1.2.1.33.1.2.1.0`；读取 CSV 文件 Force 列的 File 点位是 `column?name=Force`；读取订单 4711 数量的 Database 点位是 `row?table=dbo.Orders&column=Quantity&key=OrderNo&equals=4711`；OPC UA、AVEVA PI 和 HTTP 则是那个记号本身（前面拼上设备的资源路径）。

### 仿真信号参数 {#simulated-signal-parameters}

Simulated 的点位没有地址字段：它的名字就是那个点。取而代之的是：**信号种类**，一份收窄到这种数据类型能驱动的那些形状的列表，每个名字旁边配一张形状的小图（数值是正弦、斜坡、随机游走和计数器；布尔是布尔翻转；文本是枚举文本；日期时间是时钟；Guid 是随机 GUID；ByteString 是随机字节；设定值保持和脉冲对任何类型都有）。**默认值**在随机游走、计数器和设定值保持时出现，形式是一个文本字段，布尔是一个“默认为开（true）”勾选框，日期时间是一个日期字段。**状态（用分号分隔）**在枚举文本时出现：“例如 Run;Stop;Pause（每 3 秒走一步循环）。”面板不编辑的那些形状参数（正弦的幅带和周期、脉冲的保持时间）随点位原样带着。每一个参数都列在 [Simulated](driver-simulated) 页面上。

### 原始值 {#raw-value}

卡片以驱动送过来的最新一次原始读数收尾，也就是任何转换之前的样子，用工作站的数字格式写出；没有的时候是一道短横。

## “转换”卡片 {#the-conversion-card}

“原始值怎样变成工程值。”这张卡片对数值、布尔和文本类型画出来，它们各有自己的变换；日期时间、Guid 和 ByteString 原样直通，所以它们的卡片里只有无效读数环节。

对**数值**点位，这张卡片就是分环节的那条链，自上而下：**原始值**，然后是**量程换算**（斜率（×）、截距（+），以及一个**两点法**按钮）、**校准**（同样三样）、**无效读数**（两条策略）、**限值**（下限、上限、处理方式）、**小数位**（小数位数），最后是带单位的**工程值**。量程换算、校准、限值和小数位这几个环节的头部都有一个把这个环节打开或关掉的勾选框，右边有一个结果：环节生效时是 `= value`，被跳过时是 `→ value`。无效读数没有勾选框，因为把它关掉本身就已经是它的一条策略（对 NaN 是**原样传递**，对设备没有回答是**显示错误**）：它的头部只有标题和结果，结果始终是 `= value`。一次越限故障会把限值环节变红，并在卡片下面打出“数值 130 超出了限值（0 到 100）。”算法、默认值和策略在[数值转换链](connector-value-pipeline)里讲；两点法助手以及量程换算与校准之间的权限分工在[校准](connector-calibration)里讲。

卡片上的每个数字都和实时数值的写法一样，用工作站的数字格式写出（[语言与格式](settings-localization)）：一个环节的结果有几位小数就写几位，最多六位，小数位环节打开时则写它声明的位数；Float 点位的各个环节按 float 自己存的样子读出来（239.05，而不是 239.050003）。**工程值**是点位给出的值，也就是“实时数值”卡片、记录器和每一个表达式读到的那个值。量程换算或校准会改变数值的整数点位给出的是实数：一个量程换算斜率为 0.1 的 Int16 点位，在小数位环节读作 62.40，工程值也是 62.40（[数值转换链](connector-value-pipeline#raw-first)）。量程换算和校准都不改变数值的整数点位给出的是整数，所以当限值钳位所用的边界带小数，而小数位环节又没有设成不留小数时，数值下面会有一条说明：“Int16 只能存放整数，所以这个点位给出的工程值会四舍五入为整数。要保留转换产生的小数，请把数据类型选为 Float 或 Double。”在 Int64 或 UInt64 点位上，大到实数无法精确存放的原始值或工程值（比如按纳秒计数的值），会把每一位数字都写出来，不加分组记号。

**布尔值**点位显示**取反（上报原始值的相反数）**、**结果**，以及无效读数策略。**文本**点位显示**子串起始位置**和**长度（留空为到末尾）**、**结果**，以及无效读数策略。**日期时间**、**Guid** 或 **ByteString** 点位只显示这个环节：**设备没有回答**那一行，可选**显示错误**和**保持最近一次的有效值**。只写点位从不被读取，所以这个环节去掉设备没有回答时的那一行：数值点位只留下 NaN 策略，布尔值或文本点位根本不显示无效读数环节，日期时间、Guid 或 ByteString 点位则不显示“转换”卡片。

过了量程换算和校准，数值的其余环节以及布尔和文本的变换都是普通配置：“配置 Connector”能改它们，其他人只能读。

## “实时数值”卡片 {#the-live-value-card}

| 条目 | 显示什么 |
| --- | --- |
| **当前值** | 带单位的工程值，用工作站的数字格式写出（[语言与格式](settings-localization)）：小数位环节声明几位就写几位（量程换算和校准都不改变数值的整数类型不写小数），这个环节关掉时，读数有几位就写几位，最多六位；没有的时候是一道短横。 |
| 替代值说明 | 当这个值不是一次测量时：“正在代替缺失的测量值。”“最近一次有效值，在设备不响应期间保持。”或“正在代替失败的读取。”，取决于无效读数策略。 |
| 读数停止更新说明 | 读数停止更新时，也就是在点位的轮询间隔再加 10 秒之内没有新的读数到来时：“应用时间戳之后，再没有收到新的读数。点位将此视为一次失败的读取。”上面的数值是[设备没有回答](connector-value-pipeline#the-device-did-not-answer)时点位呈现的内容，默认是一道短横；点位保持最近一次有效值或用一个值代替时，旁边还有替代值说明。圆点变成琥珀色，设备的健康状态把这个点位算作没有应答。 |
| **源时间戳** | 现场设备取到这次读数的时刻。对 OPC UA 设备，它是服务器随数值一起发来的源时间戳；服务器可以一直保留这个时间戳，直到数值或它的质量发生变化，所以一个稳定不变的数值可能显示比应用时间戳更早的时间。对其他驱动，它是 Connector 收到这次读数的时刻，与应用时间戳相同。读取正在失败期间，标签变成**最近一次尝试**，时间戳是那次尝试的；在保持最近一次好的值期间，或者读数停止更新期间，标签仍是**源时间戳**，时间戳仍是那次读数的。 |
| **应用时间戳** | Connector 收到它的时刻。 |
| **写入值** | 对读写或只写的点位，并且只对“配置 Connector”：一个文本字段（布尔是勾选框“开（true）”，日期时间是日期字段）和**写入**。“请输入工程值；写入之前会反向做量程换算和取反。”状态行在任何东西离开之前写着“请输入要写入的值。”或“该值无法转换。”，值在路上时写着“正在写入…”，然后才是结果。 |

有运行占住工作站或运行时已停止时，“写入”带着原因置灰。等现场设备的是这块面板，不是 Logic，所以状态行报出的是这个值究竟遭遇了什么，而不只是请求已经发出；第一个值还在路上时，同一点位的第二个值会被拒绝。它分得清的几种结果：

| 状态行 | 发生了什么 |
| --- | --- |
| “值已写入。” | 现场设备收下了这个值。 |
| “写入被拒绝：信号源正被一次操作占用。” | 有一次运行或者一道联锁占着这个点位。出口点出了占用者时，那句话就写在这句拒绝的位置上（“写入被拒绝：`<原因>`。”）。 |
| “写入被拒绝：这个点位是只读的。”“写入被拒绝：这个点位已经不在运行中。”“写入被拒绝：该值与点位类型不符。”“写入被拒绝：本工作站现在不接受写入。” | 工作站在任何东西发出去之前就断定了。 |
| “‘Flow’在发送前已被更新的值替换。” | 在设备的队列里，同一点位上更新的一个值赶超了它并且代它出发。这不算失败：现场设备被告知的是更新的那个值。 |
| “写入在到达现场设备之前已取消。” | 这个请求还在排队等着轮到自己时就被撤回了。 |
| “现场设备拒绝了写入。”“现场设备拒绝了写入：`<原因>`。” | 设备或它的驱动拒绝了这个值。驱动给出了原因时，原因用工作站的语言写出（“该地址是只读的”“设备未连接”）；现场设备自己的代码在任何语言里读起来都一样，所以原样写出：比如 Matter 设备的状态（CONSTRAINT_ERROR, 0x87）、ADS 错误（ADS 0x704）。工作站无法用自己的语言说出原因的拒绝不带原因显示，驱动自己的英文说法留在诊断日志里。工作站知道类型的失败（Modbus 单元的异常应答、断开的连接、HTTP 状态）则改用点位红色那一行给它的句子，在每种语言里都是如此，与[最近错误](connector-health#last-error)相同。 |
| “写入未得到确认：现场设备没有及时应答。” | 没有及时收到答复，所以不知道现场设备是否收下了这个值。 |
| “写入失败：无法连上现场设备。” | 线路那头答复的其余一切，首先是设备没有连上。 |

原始值发出去之前有哪些东西被反算，见[数值转换链](connector-value-pipeline#writes-reverse-the-pipeline)。

## “被谁使用”卡片 {#the-used-by-card}

“工作站上读取或写入这个点位的一切。”表里逐条列出每一处引用，带**种类**（通道、停机联锁、自动化、变量、动作、报警、仪表画面、Modbus 服务器、OPC UA 服务器、MQTT 发布）、**位置**（持有它的那个模型或仪表画面；顶层的 Logic 种类和 [Modbus 服务器](connector-modbus-server)寄存器映射里的行为空）和**名称**（映射里的行写它的寄存器类别和手册中的地址，例如 保持寄存器（4xxxx） 40101）。一处都没有时写“没有任何通道或属性引用它。”这次查找只是参考：查找失败时表格留空。映射里的一行按标识保存它的点位，所以会跟着改名走；点位被删除之后，它会继续指向失去的那个点位，读取它的客户端会收到异常 04，所以它列在删除点位的这里。[OPC UA 服务器列表](connector-opcua-served-nodes)里的行也按同样方式列出，名称处显示它的访问方式；替换点位时，这一行会移到新的点位上。Broker[发布卡片](driver-mqtt#the-publish-card)里的行也这样列出，位置显示 Broker，名称显示它的主题；替换点位时主题保持不变。

对“配置 Connector”，卡片还多出替换那一套：一个按地址列出实时地址空间里所有其他点位的选择器、一个**全部替换**按钮，以及一个按行的替换动作。“全部替换”在一个要么全成要么全不成的批次里，把列出的每一处引用都改写到选中的那个点位上（“4 处引用现在使用 Connector.Simulated.Air.Pump.Flow。”；“没有可替换的引用。”）；按行的动作只改写那一处（“‘Furnace temperature’现在引用 Connector.Simulated.Air.Pump.Flow。”，或者在它中途被人挪走时写“这处引用在此期间被改动了。请刷新后重试。”）。停机联锁和自动化的引用属于 Process 的结构，所以替换它们还额外需要“管理 Process”：“替换单元的联锁信号源需要“管理 Process”权限。”以及“全部替换里含有一个单元的联锁信号源，需要“管理 Process”权限。”还没选点位时，“全部替换”和行上的动作都是灰的，提示文字是“先选好接收这些引用的点位。”；只要有引用需要当前角色没有的“管理 Process”，它们也是灰的，提示文字就是上面那句话。Modbus 服务器寄存器映射里的行按服务器自己的规则改到选中的点位：客户端可写的行会拒绝不接受写入的点位，这时什么都不替换。

## 点位页面不做什么 {#what-the-tag-page-does-not-do}

点位所属的设备和驱动是定死的；要挪一个点，就在另一台设备上把它建出来，再用“全部替换”。这里一次只编辑一个点位的那些环节；多行编辑是设备表格的批量编辑，见[设备](connector-devices#mass-edit)。页面上没有历史，也没有趋势：实时圆点、数值和时间戳都是当前这一次采样，每秒刷新一次。
