# 设备

> 设备页面：它的标题栏和命令、“设备”卡片、按驱动显示不同字段的“连接”卡片、凭据与证书、带批量编辑的“点位”表格、复制一台设备，以及重名和冲突是怎么处理的。

一台**设备**就是工作站通过某个驱动去对话的一台仪器：怎么够到它，以及从它那里读哪些点位。在通信栏里选中一台设备的行，或者在一个驱动、一条线路、一个 Broker 或一个文件夹的表里按某台设备行上的“打开”，就能打开它的页面。“查看 Connector”能读它，“配置 Connector”能改它。串行线路有自己的页面，见[串行线路](connector-lines)；MQTT Broker 在[MQTT](driver-mqtt#the-broker)里说明。

## 新建一台设备 {#creating-a-device}

| 手势 | 结果 |
| --- | --- |
| 栏底的**新建…** > `<Driver>` > **新建设备** | 一台位于驱动本级的设备，出现在设备直接挂在驱动下面的每一个驱动下。 |
| 一个驱动页面上“设备”表里的**添加设备** | 同上。 |
| 一个文件夹的“设备”表里或它右键菜单里的**新建设备**，或者**新建…** > `<Driver>` > `<Folder>` > **新建设备** | 一台归在那个文件夹里的设备；在 Matter 下面会打开配对表单，配对的节点归在那个文件夹里。 |
| 一条串行线路的“设备”卡片上或右键菜单里的**添加设备**，或者**新建…** > `<Driver>` > `<Line>` > **新建设备** | 那条线路上的一台 Modbus RTU 设备，用第一个空闲的单元 ID；在 Generic serial and TCP 驱动或 SCPI instruments 驱动的线路上，则是线路上的一台该驱动的设备。在 Omron 驱动的线路上，按 0 到 31 中第一个空闲的单元号在线路上创建 PLC。 |
| 一个 Broker 的“设备”卡片上或右键菜单里的**添加设备**，或者**新建…** > MQTT > `<Broker>` > **新建设备** | 那个 Broker 下的一台 MQTT 设备，普通 MQTT。 |
| 一条设备发现结果上的**添加设备** | 一台带着扫描找到的 endpoint、以及你勾选的那些点位的设备；见[设备发现](connector-discovery)。 |
| Matter 驱动命令栏上的**配对设备**，或者**新建…** > Matter > **配对设备** | 一个已调试好的 Matter 节点，放在驱动自己的层级；见[设备发现](connector-discovery#pairing-a-matter-device)。 |
| 一台设备上的**复制设备** | 选中那台设备的一份副本，点位也在内。 |

新设备名叫“新建设备”（然后是“新建设备 2”，依此类推），启用状态，轮询间隔 1000 毫秒，单元 ID 为 1，端口是它的驱动所用的那个（见下面的“连接”卡片；Generic serial and TCP 驱动的设备一开始没有端口），它不会被打开：它在列出它的那个页面（驱动、文件夹、线路或 Broker 的页面）的“设备”表格里突出显示，并滚动到可见处，记录条写“已添加设备‘新建设备’。打开它即可编辑详细信息。”从那张表格新建时，画面停在原处；从“新建…”或右键菜单新建时，画面转到那个页面。用这一行的**打开**，或者树里它那一行，打开这台设备。本安装包没带的驱动下面拒绝新建设备；Matter 下面也拒绝，因为那里的设备只能来自配对或发现（“要添加新的 Matter 节点，请用‘配对设备’；要添加已经调试好的节点，请用‘发现设备’。”）。这些手势都在已添加的驱动下面进行；怎样添加驱动见[驱动列表与单个驱动的页面](connector-drivers#row-actions)。

驱动要通过主机去连现场设备的设备（凡是带有**主机**字段的驱动）新建时主机为空，在填写主机之前，工作站不会尝试连接它：它的状态点保持灰色，行和页面都显示“尚未填写主机”，它的点位读作空档，而且在有地址可试之前不会出现任何连接错误。在此期间它绝不会被指向本机；设备确实在本机上时，请填写 `localhost`。NI-DAQmx 设备没有主机：它以同样的方式等待**设备名称**，在有名称之前显示“尚未填写 NI-DAQmx 设备”（见 [NI-DAQmx](driver-ni-daqmx#the-ni-daqmx-device-card)）。Fluke NetDAQ 设备先等待主机，再等待其仪器的**基本通道**，在有基本通道之前显示“尚未填写基本通道”（见 [Fluke NetDAQ](driver-fluke-netdaq#device)）。File 设备等待其**文件夹路径**，在有文件夹之前显示“尚未填写文件夹”（见 [File](driver-file#device)）。Database 设备等待其数据库的位置（服务器和数据库名称、文件或数据源），在有服务器之前显示“尚未填写服务器”（见 [Database](driver-database#the-database-card)）。LoRaWAN 设备等待其 **设备 DevEUI**（传感器）或 **基站 EUI**（集中器），在有标识符之前显示“尚未填写 DevEUI”或“尚未填写基站 EUI”（见 [LoRaWAN](driver-lorawan#connection-fields)）；已经填写但不是 16 位十六进制数的标识符不会被等待，而是被拒绝。

有了主机以后，连接从来不是一道拦路的步骤：Connector 把设备登记下来，并在后台的重试循环里去连它，所以一台够不着的设备不花什么代价。在连接接上之前，它的点位读作空档，页面同时显示最近一次连接错误。

## 标题栏 {#the-header}

名称、一行“本工作站所连的一台设备：怎样连上它，以及从它读取哪些点位。”，以及一枚带着**基础 URI** 的胶囊，也就是 Connector 实际连过去的那个地址，由“连接”卡片实时拼出来（例如 `modbus+tcp://192.168.0.10:502/1`、`opc.tcp://plc:4840`、`simulated://CompressedAir`）。还没有主机的设备没有基础 URI，因此在填写主机之前不显示这枚胶囊。字段拼不出驱动接受的地址时，同样不显示这枚胶囊，例如线路缺失的 Modbus RTU 设备，或者其线路还留着线路页面没有保存的值的设备。下面是六种通知之一：

- **本安装包不包含该驱动**：“这台设备需要 … 驱动，而本次安装不包含它，因此它保持离线。它的设置会保留，也可以删除；这里的其他任何操作都不会改变它读到什么。”省略号处是驱动的名称。
- **本计算机未安装 VISA**（SCPI instruments，通过 VISA 连接的设备）：“此设备通过 VISA 连接仪器，而本计算机没有 VISA，因此它保持离线。安装 NI-VISA 或 Keysight IO Libraries Suite 后设备即可连接。带网络端口的仪器也可以通过 TCP 连接。”见 [SCPI instruments](driver-scpi#visa-on-this-computer)。
- **本计算机未安装 NI-DAQmx**（NI-DAQmx，在没有它的计算机上）：“此设备通过 NI-DAQmx 读取，而本计算机没有 NI-DAQmx，因此它保持离线。Ganter Lab 不包含 NI-DAQmx：从 ni.com 免费获取并安装后，设备将按现有配置连接。”见 [NI-DAQmx](driver-ni-daqmx#ni-daqmx-on-this-computer)。
- **正在等待证书批准**（OPC UA、Redfish、AVEVA PI、走 HTTPS 的 HTTP、走 TLS 的 MQTT）：“这台现场设备出示了一份本工作站从未批准过的证书，因此暂时不从它读取任何数据。请与调试该设备的人核对指纹，然后在 OPC UA 驱动页面的‘现场设备访问’里批准它。”（驱动名称是该设备自己的驱动），MQTT 设备则是“这个设备的 Broker 出示了一份本工作站从未批准过的证书，因此暂时不从该设备读取任何数据。请与管理该 Broker 的人核对指纹，然后在 MQTT 驱动页面的‘现场设备访问’里批准它。”并带一个**查看证书**按钮，它会在那份证书上打开该驱动页面的现场设备访问（[OPC UA](driver-opc-ua#equipment-access)、[Redfish](driver-redfish#equipment-access)、[AVEVA PI](driver-aveva-pi#equipment-access)、[HTTP](driver-http#equipment-access)、[MQTT](driver-mqtt#equipment-access)）。
- **尚未填写主机**（已启用但主机仍为空的设备上的中性通知）：“在这台设备填写主机之前，工作站不会尝试连接它，因此暂时不从它读取任何数据，也没有错误可显示。在下面的‘连接’卡片里填写主机，工作站就会连接它。”没有设备名称的 NI-DAQmx 设备则显示 **尚未填写 NI-DAQmx 设备**：“在这台设备填写 NI-DAQmx 设备名称之前，工作站不会尝试连接它，因此暂时不从它读取任何数据，也没有错误可显示。在下面的‘NI-DAQmx 设备’卡片里填写 NI MAX 为设备起的名称，工作站就会连接它。”没有文件夹的 File 设备显示 **尚未填写文件夹**：“在这台设备填写文件夹之前，工作站不会读取它，因此暂时不读取任何数据，也没有错误可显示。在下面的‘文件夹和文件’卡片里填写文件夹，工作站就会开始读取。”没有说明数据库位置的 Database 设备，按仍缺少的内容显示 **尚未填写服务器**、**尚未填写数据库名称**、**尚未填写数据库文件** 或 **尚未填写数据源**：“在这台设备说明其数据库的位置之前，工作站不会连接它，因此暂时不读取任何数据，也没有错误可显示。在下面的‘数据库’卡片里填写（服务器和数据库名称、文件或数据源），工作站就会连接。”
- 否则，经由有错误的串行线路或 Broker 的设备，显示一条指向那里的平和提示“此设备经由串行线路 Bench bus，该线路有错误。原因见线路页面。”；不然，有自身错误时就是那台设备红色的错误文字（见[启用与健康状态](connector-health#last-error)）。

在这些下面，设备在与树里相同的红色标记后面点名有自身错误的点位：“3 个点位有错误：C3、Opt_Int、T5”，超过三个名称的部分只计数。每个点位的原因留在点位上。设备未连接期间不点名任何点位：设备自身的错误说明了原因。

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

| 命令 | 作用 | 何时置灰（情况） | 何时不画出来（角色） |
| --- | --- | --- | --- |
| **重新连接** | 关掉这台设备的连接再重开一次，不碰别的设备。记录条会等驱动回话，然后说结果：“已重新连接‘Furnace’。”，或者“无法重新连接‘Furnace’：”加上原因。什么都不会被重新加载，而一台只是晚一点才应答的设备照样会自己回来。 | 正在扫描或配对，有运行占住工作站，运行时已停止，或者设备还在等它的地址。此时它的悬停提示会说出驱动缺什么，用的是设备自己那一行的字眼：通过主机连接现场设备的驱动显示“尚未填写主机，因此没有连接可以重新打开。”，其他驱动的句子前半换成各自的提示，后半不变：NI-DAQmx 是“尚未填写 NI-DAQmx 设备”，File 是“尚未填写文件夹”，之后是“尚未填写文件名”，Database 是“尚未填写服务器”“尚未填写数据库名称”“尚未填写数据库文件”或“尚未填写数据源”，LoRaWAN 是“尚未填写 DevEUI”或“尚未填写基站 EUI”。 | 没有“配置 Connector”权限时。 |
| **启用** | 让这台设备参与采集。 | 已经是启用的，或者工作站拒绝改动。 | 没有“配置 Connector”权限时。 |
| **禁用** | 停掉与这台设备的全部通信，并把它的点位从实时地址空间里撤下来；每个点位仍保留自己的“已启用”开关。 | 已经是禁用的，或者工作站拒绝改动。 | 没有“配置 Connector”权限时。 |
| **复制设备** | 造一份副本，并在列出它的那个页面的表格里突出显示（见下）。 | 本安装包没带这个驱动（“本安装包不包含该驱动。”），或者工作站拒绝改动。 | 没有“配置 Connector”权限时。 |
| **删除设备**（危险色，靠右） | 先问“要删除‘Furnace’吗？这同时会删除它的全部点位。 此操作无法撤销。”，然后删除并选中它的上一级（线路、Broker、它所在的文件夹或驱动），在树中展开并显示其表格。 | 工作站拒绝改动。 | 没有“配置 Connector”权限时。 |

右键菜单里还多出**添加点位**和**移动到**（见[设备文件夹](connector-folders#moving-a-device)）。

## “设备”卡片 {#the-device-card}

| 字段 | 它是什么 | 取值 / 默认值 | 影响 |
| --- | --- | --- | --- |
| **名称** | 友好名称；也是这台设备总线身份和地址的最后一段。 | 必填；在驱动内部唯一，不区分大小写。 | 打字时会预告这次重命名要带走什么（“正在检查引用…”，然后是有多少处引用会跟着改，或者“有效地址不会改变，没有引用需要更新。”）；按回车或离开字段就确认，指向旧地址的每一处引用都在同一次操作里被改写：“设备已重命名，更新了 3 处引用。”名字留空会被拒绝：“设备名称不能为空。” |
| **驱动名称** | 这台设备说的协议。 | 只读。 | 创建时定死，见[驱动](drivers)。 |
| **轮询间隔（ms）** | 工作站多久读一次这台设备的点位，除非某个点位自己另有规定。 | 1000；填零或更小会按 1000 存下来。 | 对固定 1 秒轮询或接收推送数据的驱动隐藏（Mitsubishi MC、BACnet、OCPP、LoRaWAN、MQTT）。 |

## “连接”卡片 {#the-connection-card}

只要驱动声明了连接字段，这张卡片就出现，并且只显示那个驱动会读的字段。每个驱动的页面把自己的字段讲得更细；这里是面板画出来的完整清单。

| 字段 | 哪些驱动显示 | 它是什么 |
| --- | --- | --- |
| **主机** | Modbus TCP、OPC UA、Siemens S7、Rockwell、Omron、Beckhoff、Mitsubishi、BACnet、Redfish、AVEVA PI、HTTP、Generic serial and TCP（TCP 客户端）、SCPI instruments（TCP）、SNMP | 主机名或 IP 地址。留空时设备完全不会被连接（见[新建一台设备](#creating-a-device)）；设备在本机上时请写 `localhost`。IPv6 字面量会在基础 URI 里替你加上方括号。也可以粘贴完整地址：驱动自身的方案（`opc.tcp://`、`modbus+tcp://` 等）会被去掉，主机后的端口进入端口字段，路径进入资源路径。设备没有字段可存的内容（其他协议的方案、驱动不保存的路径或端口、方案后未加方括号的 IPv6 地址）会被拒绝，字段下方说明原因，字段回到当前的主机。不能作为名称的主机（用点分隔的某一段为空（`plc..local`）、超过 63 个字符，或以连字符开头或结尾）也会同样被拒绝。 |
| **端口** | Modbus TCP、OPC UA、Beckhoff、Mitsubishi、Omron（FINS）、BACnet、Redfish、AVEVA PI、HTTP、Generic serial and TCP（TCP 客户端）、SCPI instruments（TCP）、SNMP | TCP 端口，1 到 65535，或 SNMP 代理应答的 UDP 端口。新设备一开始就是它的驱动所用的端口（502、4840、851、5007、5025、9600、47808、443、161）。框留空时，这个端口以灰色显示，设备就在这个端口上被拨号连接：以 0 保存的设备也是这样显示的，清空这个框就回到这个端口。AVEVA PI 和 HTTP 一开始是空的，因为它们的端口跟随所选传输：走 HTTPS 是 443，明文是 80，灰色的端口也随传输而变。Generic serial and TCP 一开始也是空的，也没有灰色端口：这类现场设备没有标准端口，没填端口之前设备不会连接。 |
| **单元 ID** | Modbus TCP、Modbus RTU | Modbus 的单元 ID：TCP 上是 0 到 255；串行线路上是 1 到 247，每条线路内唯一。在串行线路上，其他数字在到达设备之前就会被拒绝：操作记录条说明原因（“单元 ID 必须在 1 到 247 之间。”），字段回到当前的单元 ID。 |
| **帧格式** | Modbus TCP | 每个请求在连接上以什么帧传送：MBAP（Modbus TCP 本身，默认）或 RTU（把带 CRC 的 RTU 帧原样发送，用于透传模式的串口转以太网转换器）。选 RTU 时基础 URI 带上 `framing=rtu`。见 [TCP 上的 RTU](driver-modbus-tcp#rtu-over-tcp)。 |
| **最小事务间隔（ms）** | Modbus TCP | 一次完成的尝试之后、endpoint 开始下一次之前的静默，0 到 1000，默认 0（“兼容性辅助手段，0-1000 毫秒。填零不加任何人为延时。”）。共用同一主机和端口的已启用设备取其中最大的那个值，别的设备把它抬高时卡片会说出来：“实际 200 ms · 192.168.0.10:502 上另一台已启用的设备把这个 endpoint 的下限抬高了。” |
| **串行线路 · 固定** | Modbus RTU、Generic serial and TCP（线路上的设备）、SCPI instruments（线路上的设备）、Omron（线路上的设备） | 线路的名称和它的参数组，只读；要改就到线路自己的页面上改。“缺少线路”或“未指定物理线路”表示这台设备丢了它的线路，保存不了：“必须指定一条串行线路。” |
| **Broker · 固定** | MQTT | Broker 的名称和它下面的地址，只读；连接和登录信息要到 Broker 自己的页面上改。“缺少 Broker”表示这台设备丢了它的 Broker，保存不了：“必须指定一个 MQTT Broker。” |
| **协议** | MQTT、Omron | MQTT 下为 **普通 MQTT** 或 **Sparkplug B**：决定每个点位指的是主题还是指标。见[MQTT](driver-mqtt#device)。Omron 下为 **FINS** 或 **NJ/NX 点位（按名称）**：决定每个点位指的是存储区地址还是变量，以及设备有没有端口和 FINS 卡片。见[Omron](driver-omron#connection)。 |
| **组 ID**、**边缘节点 ID**、**设备 ID** | MQTT，仅 Sparkplug B | 设备本身就是的那个边缘节点，或它后面的设备；设备 ID 留空就读边缘节点自己的指标。一个 Sparkplug B 身份在每个 Broker 上只能配置一次。 |
| **机架 / 槽位** | Siemens S7 | 两个数字；基础 URI 读作 `s7://host:rack:slot`。 |
| **槽位** | Rockwell EtherNet/IP | 一个数字，也就是控制器插在机箱的第几位；CIP 路由不带机架，基础 URI 读作 `eip://host:slot`。 |
| **本机 IP（AMS）** | Beckhoff ADS | 本工作站在 AMS 路由上的 IP；两个 AMS net id 都由 `<ip>.1.1` 推出来。留空就用本工作站在通往 PLC 的网络上的地址，并以灰色显示。 |
| **PLC 的 AMS Net Id** | Beckhoff ADS | PLC 自己的 AMS Net Id，用于 id 不是其 IP 后面跟 `.1.1` 的 PLC。留空时用主机的 IPv4 地址后面跟 `.1.1`（名称先解析），并以灰色显示。 |
| **设备 Id** | BACnet | BACnet 的设备实例号。 |
| **服务器 / 键** | LoRaWAN | 应用密钥。 |
| **标识符** | OCPP、LoRaWAN | 充电桩的 id，或者 DevEUI（带冒号或短横线的写法会被规整成纯十六进制）。留空就退回到规整过的设备名称。 |
| **资源路径** | OPC UA、AVEVA PI、HTTP | 接在授权部分后面的一段路径：OPC UA 的服务器路径、PI Web API 的服务根（默认 `piwebapi`），或者每个 HTTP 点位路径都拼在后面的那个前缀。 |
| **传输方式** | AVEVA PI、HTTP、Generic serial and TCP、SCPI instruments | 在 Generic serial and TCP 驱动的网络设备上是一个列表：TCP 客户端或 UDP 监听，选 UDP 时主机和端口变成“仅接受来自”和本地端口（见 [Generic serial and TCP](driver-generic-serial-tcp#connection)）。在不在线路上的 SCPI instruments 驱动设备上，是一个列表：TCP（LXI 套接字）或 VISA（USB、GPIB、网络），选 VISA 时主机和端口变成 VISA 资源（见 [SCPI instruments](driver-scpi#connection)）。在 AVEVA PI 和 HTTP 上是勾选框**用普通 HTTP 发送**。不勾表示 HTTPS，说明是“HTTPS。Bearer 令牌或密码在送往 PI Web API 的路上保持加密。”；勾上之后，说明变成一条警告：令牌或密码在每一次请求里都以明文发送，这是给只在这种传输上应答的 PI Web API 用的。HTTP 设备带着同一个勾选框，配的是它自己的说明，讲的是请求以及它送出的任何凭据；在那里，主机前面写上 `http://` 或 `https://` 也会拨动这个勾选框，而主机则不带它存下来。 |
| **VISA 资源** | SCPI instruments（VISA） | VISA 列出的仪器名称，例如 `USB0::0x0957::0x1A07::MY12345678::INSTR`，取代主机和端口。发现设备会自动填入。 |
| **用户名**、**密码** | OPC UA、Redfish、AVEVA PI | 按设备保存的凭据；用户名为空表示匿名连接（“留空 = 匿名。按设备分别保存；密码在存储时受保护。”）。 |
| **Bearer 令牌** | AVEVA PI | 一个令牌，填了它就压过用户名和密码；**显示令牌**把它显出来。 |

Matter 设备显示的是另一张“连接”卡片：**节点 ID · 只读**，也就是配对时分配的那个 64 位节点 id（存下来的身份读不出来时写“需要重新配对”），**网络 · 只读**，也就是设备配对时加入的网络的名称（在 Ganter Lab 记录网络之前配对的设备，或者用“发现设备”添加的设备，会写明没有记录），以及**状态**，也就是这台设备的健康状态词。上面没有一样东西可以编辑。Simulated 设备根本没有“连接”卡片。Generic serial and TCP 驱动的设备在“连接”卡片下面还有两张卡片，消息和校验和，规定消息如何结束、如何校验，见 [Generic serial and TCP](driver-generic-serial-tcp#the-messages-card)。通过 FINS 读取的 Omron 设备在“连接”卡片下面有一张 FINS 卡片，含传输方式、网络、节点、单元和响应超时，见 [Omron](driver-omron#the-fins-card)。SCPI instruments 驱动的设备在“连接”卡片下面有一张“仪器”卡片，含仪器的标识、结束符、响应超时、写入确认和初始化命令，见 [SCPI instruments](driver-scpi#the-instrument-card)。NI-DAQmx 设备没有“连接”卡片：取而代之的是“NI-DAQmx 设备”卡片，显示 NI MAX 为设备起的名称和 NI-DAQmx 从它读出的产品，见 [NI-DAQmx](driver-ni-daqmx#the-ni-daqmx-device-card)。SNMP 驱动的设备在“连接”卡片下面有一张“SNMP 代理”卡片，含版本、community 或 SNMPv3 用户及其安全级别、协议和密码、响应超时和重试次数，见 [SNMP](driver-snmp#the-snmp-agent-card)。File 设备没有“连接”卡片：“文件夹和文件”卡片占据它的位置，含文件夹、文件和格式，后面是“文件文本”卡片，在读取单个文件的设备上还有“写入”卡片，见 [File](driver-file#the-folder-and-file-card)。Database 设备没有“连接”卡片：“数据库”卡片占据它的位置，含数据库类型和数据库所在位置，除 SQLite 外的每种数据库后面还有“登录”卡片，见 [Database](driver-database#the-database-card)。

### 凭据与证书 {#credentials-and-certificates}

密码、承载令牌和 SNMP community 在静态存储时由 Windows 的每用户数据保护看着，所以配置数据库里从不保存明文值。这层保护绑定在输入这个秘密的那个 Windows 账户和那台机器上：换一个账户，字段回来时是空的，并带一句说明“在这个 Windows 账户下无法读取：它只能在输入它的那台计算机和那个 Windows 账户上打开。请在这里重新输入。”凭据是直接交给驱动的；它们不会出现在基础 URI 里，也不会出现在诊断日志里，而且操作记录条显示的错误消息里也会被抹掉。

OPC UA 设备在会话打开之前会出示它的现场设备证书；Redfish、AVEVA PI 或 HTTP 设备通过 HTTPS 连接的现场设备，以及 MQTT 设备通过 TLS 连接的 Broker，也是如此。一份 Windows 不信任、本工作站也从未批准过的证书不会悄悄地失败：树里和页面上这台设备都读作“正在等待证书批准”，提示条上的按钮会在那份证书上打开它所属驱动页面的现场设备访问，好去批准或阻止它。之后撤销批准，会关掉基于它跑着的那些连接。细节在各个驱动的页面上：[OPC UA](driver-opc-ua#equipment-access)、[Redfish](driver-redfish#equipment-access)、[AVEVA PI](driver-aveva-pi#equipment-access)、[HTTP](driver-http#equipment-access) 和 [MQTT](driver-mqtt#equipment-access)。

## “命令”卡片 {#the-commands-card}

有三个驱动够到的现场设备除了被读之外还会被要求做事：**HTTP**、**Redfish** 和 **AVEVA PI**。它们的设备页面在“连接”和“点位”两张卡片之间多一张**命令**卡片，标题下写着“可以要求这台现场设备做的事。每条命令指明请求发往的路径，位于设备地址之下。”所有人都看得见这张清单；声明、编辑和下发需要“配置 Connector”，没有这个权限位的角色既看不到字段也看不到命令。

**添加命令**添一行，名叫“命令 1”（编号接着已有的往后排）。每一行带着：

| 列 | 它是什么 |
| --- | --- |
| **名称** | 这条命令叫什么。它同时也是这台设备在本工作站自己的 OPC UA 地址空间里的方法名，所以在设备内部唯一。 |
| **路径** | 请求发到哪里，接在设备自己的地址下面：现场设备文档点名的那条路径，例如 `redfish/v1/Systems/1/Actions/ComputerSystem.Reset`。没有路径的命令永远不会被放到设备上。 |
| **参数** | 这条命令接收的那一个值的名字，按现场设备的叫法写（`ResetType`）；不接收任何东西的命令就留空。 |
| **启用** | 这条命令到底提不提供。关着的命令既不会在设备上创建，也不会被下发，这样就能把一条命令搁在一边而不丢掉它所指的东西。 |
| **数值** | 对接收一个值的命令来说，这一次按下要发的东西。它属于这一次按下，不属于设备，所以从不保存。 |

行尾那一组带着只作用于这一行的两条命令：**运行**，它把命令发出去并报告现场设备答了什么（“‘Reset’的回答：已接受”），以及**删除**。“运行”在被拒绝时会说明原因而不是消失：命令还没有路径（“这条命令还没有路径，因此没有东西可以发送。”）、命令是关着的、命令还等着被存进运行时、设备没有连上，以及工作站自己的工程或运行边界。别的驱动根本不带这张卡片：充电桩也接收命令，但它的命令由协议定死，来自驱动，而不是来自你在这里打的字；Matter 节点则不接收任何命令，对它的每一次改动都是写它的某个点位。

下发命令就是对现场设备的一次写入，所以“运行”走的是和手动写点位同一条通道：命令排在工作站已经在做的事情后面等自己的一轮，沿着外部系统调用走的同一条路到达现场设备，每一次按下都会记下请求了什么、在哪台设备上、回来了什么。工作站不再接受工作时，按下会得到答复而不是悄无声息：“本工作站现在不接受命令。”Connector 没有运行时会答“Connector 没有运行，因此无法向现场设备下发任何东西。”，而现场设备自己的拒绝会原样转达。Connector 未能执行的命令会像设备的红色提示行那样，用工作站的语言说明它遇到了什么：断开的设备为“设备未连接，因此没有向它发送任何东西。”，没有及时应答的设备、被网络拒绝的请求或失败的驱动也是如此；诊断日志保留技术行。

## “点位”卡片 {#the-tags-card}

卡片的标题是**点位**，后面跟着“地址格式 · `<hint>`”，说明这个驱动怎么给一个点位寻址（“自由形式的点位名（例如 sim/temperature）。”“寄存器号 + 数量（按字段填）。”“节点 ID，例如 ns=2;s=Temperature。”）；对“配置 Connector”还有一句指引“勾选若干行，然后编辑一个单元格，就会应用到所有勾选的行。应用之后勾选自动清除。”以及**添加点位**按钮。“添加点位”创建“点位 5”（编号接着当前数量往后排），类型是 Float 或者这个驱动支持的第一种类型，只读。这个点位不会被打开：它在表格里自己类型的分组中突出显示，并滚动到可见处，字段就在这一行里编辑，它的**打开**通往它的页面。记录条里写“已给‘Furnace’添加点位。”，或者在新点位还缺东西时写“已向‘Furnace’添加点位。请在它所在的行中填写详细信息。”在这一栏的“新建…”菜单里，一台设备的那一项提供**新建点位**，设备的右键菜单提供**添加点位**：两者都把画面转到设备的页面，并做同样的事。添加点位按钮旁边，在设备的驱动能读单台设备的点的地方，还有**发现点位**：扫描设备公开的值，列出还没有点位的那些（见[发现一台设备的点位](connector-discovery#discovering-a-devices-tags)）。

### 表格 {#the-grid}

行按数据类型分组，顺序是：**数值**、**布尔值**、**文本和其他**，每一组的组头带着它的数量。列的顺序跟着点位页面上卡片的顺序走；某一行用不上的单元格（布尔点位上的数值字段）画成空的并且不可用。

| 列 | 分组 | 编辑什么 |
| --- | --- | --- |
| 勾选框 | | 把这一行选进一次批量编辑。只对“配置 Connector”画出来。 |
| **名称** | 常规 | 点位的名称，重命名预告和引用改写与页面上一样。从不被复制到别的行。有自身错误的点位，名称后面带着树里同样的红色标记，原因就是提示文字。 |
| **类型** | 常规 | 数据类型；改它会把这一行的信号种类、Modbus 寄存器类别、越限处理和 NaN 策略一起对齐，见[点位](connector-tags#the-general-card)。 |
| **访问** | 常规 | 只读、只写、读写（OCPP 和 LoRaWAN 只有只读）。 |
| **单位** | 常规 | 工程单位。 |
| **轮询（ms）** | 常规 | 按点位覆盖的那个值；填 0 表示用设备的默认值。对固定速率和推送型驱动隐藏。 |
| **地址** | 信号源 | 自由文本地址，给接受这种地址的驱动用。从不被复制到别的行。 |
| **信号** | 信号源 | 仿真信号的种类，每个名字旁边配一张形状的小图。只有 Simulated 设备有。 |
| **原始值** | 信号源 | 最新一次原始读数，只读。 |
| **换算 ×**、**换算 +**、**换算后** | 转换 | 量程换算环节的系数和偏置，以及它的结果。 |
| **校准开**、**校准 ×**、**校准 +**、**校准后** | 转换 | 校准环节：它的开关、它的系数和偏置，以及它的结果。 |
| **限值开**、**最小**、**最大**、**越限处理**、**限值后** | 转换 | 限值环节：它的开关、它的上下界、它的处理方式，以及它的结果。 |
| **小数位开**、**小数位** | 转换 | 小数位环节：它的开关，以及位数，0 到 15。 |
| **取反** | 转换 | 布尔取反。 |
| **子串起**、**子串长** | 转换 | 文本的子串窗口。 |
| **数值** | 实时数值 | 工程值，只读。 |
| 动作 | | **打开**；然后对“配置 Connector”还有**启用**、**禁用**和**删除**，最后一个带确认。 |

三个环节开关和它们所管的字段一样是列，也和它们一起参与批量编辑：勾选若干行、打上系数、把环节打开，同一次编辑就改掉这些行读到的东西，不必逐个点位地打开。表格里仍然没有的，是无效读数的处理策略、两点法助手、写入字段和交叉引用：那些在点位页面上。只有“校准点位”权限的角色能读这张表，但一个格子都改不了，校准那几列和“校准开”开关也一样；它的校准编辑走点位页面。

### 批量编辑 {#mass-edit}

勾选要改的那些行，然后编辑任意一行的一个单元格：新值会应用到那一行以及每一个被勾选的行，勾选随之用掉。有行被勾选时，表格上方有一条横幅写着“已选中 3 行。编辑一个单元格会应用到所有这些行，并清除勾选。”，旁边有一个**清除选择**按钮。勾选属于这台设备：过一会儿再回到它，勾选已经清空了。有三条规则让混选也不出错：名称和地址从不被复制；类型单元格落地时会把每一行相关的字段各自对齐；某一行接受不了的值只对那一行被拒绝并保持原样，正因如此，一个文本行被塞一个数值信号种类还能活下来，一个整数行被塞一个 NaN 越限处理也一样。

## 复制设备 {#copy-device}

“复制设备”会从选中的那台造出一台归你的设备：一样的连接字段和凭据，每个点位都以全新的身份连同整条转换链、它的启用状态和轮询间隔一起克隆过来。副本先取源设备的名字，只要那个名字在这个驱动上还空着；否则依次是“Furnace (2)”“Furnace (3)”。不管源设备在哪个文件夹里，副本都落在驱动的本级；Modbus RTU 的副本留在同一条线路上，用下一个空闲的单元 ID；Generic serial and TCP 驱动或 SCPI instruments 驱动线路上的设备，副本留在那条线路上；MQTT 的副本留在同一个 Broker 上，Sparkplug B 副本最内层的 ID 也照样加编号（“Press1 (2)”），这样 Broker 上不会有两台设备指向同一个身份。副本不会被打开：画面转到列出它的那个页面（驱动、线路或 Broker），副本在它的“设备”表格里突出显示并滚动到可见处，原设备就在旁边：“已把‘Furnace’复制为‘Furnace (2)’。打开副本即可编辑。”线路上的 Omron 副本留在该线路上，取下一个空闲的单元号。

## 重名与冲突 {#duplicates-and-collisions}

设备名称在一个驱动内部唯一，不区分大小写：那些创建命令会自动加个数字后缀让开，而重命名到一个已被占用的名字上，在确认时会被拒绝。同一个驱动下面两台已启用的设备，如果名称规整之后落到同一段技术标识（`Line A` 和 `Line-A`），两台都不参与轮询，而不是其中一台胜出，并且在其中一台重命名或禁用之前，它们的点位什么都读不到。技术标识最多 128 个字符：“设备的技术标识不能超过 128 个字符。”两台 Modbus TCP 设备可以共用同一个主机和端口而用不同的单元 ID，这时它们也共用这个 endpoint 的事务节奏。两台 Matter 设备可以点名同一个节点 id：设备发现会提议改为打开已有的那台，但并不禁止第二台。两台 NI-DAQmx 设备同样可以读取 NI MAX 里的同一台设备，例如用两个轮询间隔读取同一个模块。

## 设备页面不做什么 {#what-the-device-page-does-not-do}

驱动不能改，文件夹不在这里编辑，串行线路上设备的线路和 MQTT 设备的 Broker 也都不能改派到别处；Generic serial and TCP 驱动的设备可以在 TCP 和 UDP 之间切换，SCPI instruments 驱动的设备可以在 TCP 和 VISA 之间切换，但都不能在线路和网络之间移动。启用一台设备不会启用它的点位，禁用一台设备也不会去翻它们的开关。没有按设备的导入或导出，除了把设备启用起来、再看它的健康状态和最近错误之外，也没有别的连接测试。Omron 设备在 UDP 和 TCP 之间切换，从不在线路和网络之间切换。
