# 串行线路

> Modbus RTU、Generic serial and TCP、SCPI instruments 和 Omron 驱动的串行线路节点：总线上每台设备共用的那组物理参数、它的时序、它的状态、从站扫描、归在它下面的设备，以及线路启用期间被锁住的东西。

一条**串行线路**就是一条物理串行总线：一个 COM 端口，加上它的波特率和字节格式，接在这条线上的每台设备共用这一组参数。线路存在于 Modbus RTU、Generic serial and TCP、SCPI instruments 和 Omron 四个驱动下面，位于驱动和它的设备之间，所以树读起来是 Modbus RTU > 线路 > 设备 > 点位。线路永远属于创建它时所在的驱动：不同驱动的设备绝不共用一条线路，一个端口无论属于哪个驱动都只属于一条线路。Modbus RTU 线路还拥有传输模式、响应超时以及每台从站共用的节奏；在通用驱动或 SCPI 驱动的线路上，每台设备在自己的面板中说明其消息如何结束、等待多久，线路只保留端口、波特率和格式（见 [Generic serial and TCP](driver-generic-serial-tcp#serial-line) 和 [SCPI instruments](driver-scpi#serial-line)）。在 Omron 驱动的线路上，每台 PLC 按自己的单元号应答，并自行设定响应超时（见 [Omron](driver-omron#host-link-on-a-serial-line)）。有“查看 Connector”就能看见这个页面；页面上的每个字段和每条命令都需要“配置 Connector”。

## 新建一条线路 {#creating-a-line}

有三种手势能造出一条线路，都在已添加的驱动下面：驱动页面上“串行线路”表里的**添加线路**，栏底的**新建…** > `<Driver>` > **新建串行线路**，以及驱动右键菜单里的**添加线路**。新线路名叫“新建线路”（然后是“新建线路 2”），取用 Windows 报告的、还没有别的线路占用的第一个串口（一个空闲的都没有时取 COM1、COM2，依此类推），起始参数是 9600 波特、8E1（Modbus RTU 线路还有 1000 毫秒响应超时和 0 毫秒事务间隔），并且创建出来是**已禁用**的，好让你在端口打开之前先把物理参数组配好。记录条里就是这么说的：“已添加处于禁用状态的线路‘新建线路’。请配置它的物理设置，然后启用它。”这条线路不会被打开：它在驱动页面的“串行线路”表格里突出显示，从“新建…”或右键菜单新建时画面会转到那个页面；用它那一行的**打开**来编辑它。Omron 驱动的线路则以 7E2 开始，即 Host Link 端口的出厂设置。

## 标题栏 {#the-header}

名称、健康状态圆点、状态词和物理参数组排在一行（“COM3 · 9600 · 8E1 · 1000 ms”，ASCII 线路上是“COM3 · 9600 · 7E1 · ASCII · 1000 ms”，没有超时的通用驱动或 SCPI 驱动的线路上是“COM3 · 9600 · 8E1”）；端口出故障时，下面还有一行红色的诊断文字。状态词是已关闭、空闲、正在连接…、在线和端口故障，各自的含义见[启用与健康状态](connector-health#serial-line-states)。下面点名线路上有自身错误的设备（“1 台设备有错误：Meter”）；端口本身失败期间，设备都指向线路，不点名任何设备。

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

| 命令 | 作用 | 何时置灰（情况） | 何时不画出来（角色） |
| --- | --- | --- | --- |
| **启用** | 让线上的设备开始占用总线，并锁住物理参数组。 | 线路已经是启用的，它的参数组无效，正在扫描，或工作站拒绝改动。 | 没有“配置 Connector”权限时。 |
| **禁用** | 对线上的每台设备关闭总线，但不去动它们各自的“已启用”开关，同时解锁参数组。 | 线路已经关着，正在扫描，或工作站拒绝改动。 | 没有“配置 Connector”权限时。 |
| **删除线路**（危险色，靠右） | 先问一句。空线路：“要删除‘线路’吗？这条线路上没有设备。 此操作无法撤销。”有设备的线路：“这同时会删除它的 3 台设备以及它们的全部点位。”删完之后选中线路所属的驱动。 | 正在扫描，或工作站拒绝改动。 | 没有“配置 Connector”权限时。 |

右键点线路，会在同样的启用、禁用和删除之前多出一个**添加设备**。

## “物理线路”卡片 {#the-physical-line-card}

“一条物理串行总线：这条线路上每个按从站地址寻址的设备共用的端口设置。”通用驱动或 SCPI 驱动的线路上则是“一条物理串行总线：其上仪表共用的端口设置，一次只发一个请求。”这种线路只显示名称、端口、波特率和格式，下表中标为仅限 Modbus RTU 的字段不会出现。Omron 驱动的线路显示“一条物理串行总线：其上 PLC 共用的端口设置，每台按自己的单元号应答，一次只发一个请求。”，显示的内容相同。

| 字段 | 它是什么 | 取值 / 默认值 | 影响 |
| --- | --- | --- | --- |
| **名称** | 这条总线的友好名称，显示在树里和每台设备的“串行线路”字段里。 | 必填；创建时是“新建线路”。 | 线路启用期间也能改。留空会被拒绝：“线路名称不能为空。”这个名字从不进入地址：一台 Modbus RTU 设备的地址是 `Connector.ModbusRtu.<Device>.<Tag>`，没有线路那一段。 |
| **串行端口** | Windows 的 COM 端口：物理的、虚拟的或重定向的都可以。是一个文本字段，旁边有一个列出 Windows 当前报告的端口的选择器；选中一个就填进字段。**刷新**会重新读一次操作系统的列表，但不替换你已经打进去的内容。什么都没检测到时，选择器里只有一项不可选的“没有检测到端口”，字段则写“没有检测到串行端口。请手动输入一个。” | 必填；创建时取检测到的第一个空闲端口。 | 线路启用期间锁住。一个端口只属于一条线路，不区分大小写，即使两条线路都禁用着也一样：第二条用同一端口的线路在保存时会被拒绝。 |
| **波特率** | 总线速率。 | 大于零；9600。 | 启用期间锁住。它和格式一起决定自动的帧间静默。 |
| **传输模式** | 仅限 Modbus RTU。总线上每台从站怎样组织报文：RTU 是带 CRC 的二进制帧，ASCII 是从冒号到换行、带 LRC 的文本。 | RTU、ASCII；默认 RTU。 | 启用期间锁住。ASCII 线路上，**串行格式**还多出 7N2、7E1、7E2、7O1，而且 ASCII 帧以换行结束，**自动**静默显示 0 ms；间隔下面的说明也这样写。RTU 线路拒绝 7 位格式：带 7 位格式的 ASCII 线路改回 RTU 时，格式显示为空，选定一个 8 位格式之前线路不会保存。 |
| **串行格式** | 数据位、校验位和停止位。 | 8N1、8N2、8E1、8E2、8O1、8O2，ASCII 线路和通用驱动、SCPI 驱动或 Omron 驱动的线路上还有 7N2、7E1、7E2、7O1；默认 8E1。 | 启用期间锁住。 |
| **响应超时（ms）** | 仅限 Modbus RTU。一台从站最多可以用多久来回答，超过就算这次请求失败。 | 100 到 60000；默认 1000。 | 启用期间锁住。卡片上就说了：超时放长能迁就慢设备，但也让缺席的从站和设备发现更慢才认得出来。 |
| **最小事务间隔（ms）** | 仅限 Modbus RTU。一段全线通用的静默，从一次事务尝试结束算到下一次开始，对每台从站、每次读和每次写都算，超时和失败也算在内。 | 0 到 1000；默认 0。 | 启用期间也能改；改动不必让端口重新开合就生效。填零就保持协议本身的最小值。后面跟着两个读数：**自动**，也就是 Modbus RTU 的下限（在配置的波特率和格式下，19200 波特及以下是 3.5 个字符时间，更高则是 1.75 毫秒）；以及**实际**，取下限和你填的值中较大的那个，绝不是两者相加。说明写着它是干什么的：数值越大，线上每台从站的吞吐都越低，而且它是一种兼容性辅助手段，不是用来修接线、终端电阻、接地或干扰问题的。 |

卡片以三行收尾：线路的健康状态概括（“在线 · 2/2 台设备在线”“空闲 · 没有已启用的设备”“在线 · 1 台在线 · 1 台有问题”）、此刻哪些字段可以改（“线路禁用期间可以编辑物理设置。”或“要更改物理设置，请先禁用这条线路。名称和事务间隔在线也能编辑。”；通用驱动或 SCPI 驱动的线路没有事务间隔，则是“要更改物理设置，请先禁用这条线路。名称在线也能编辑。”），以及 Modbus RTU 线路上那条关于超时的建议。

超出范围的值不会保存，原因落在记录条里：“串行端口不能为空。”“波特率必须大于零。”“响应超时必须在 100 到 60000 ms 之间。”“最小事务间隔必须在 0 到 1000 ms 之间。”输入框留着打进去的值；标题里的参数组、驱动的**物理参数组**列和每台从站的**串行线路 · 固定**，仍然显示线路存下来的样子，也就是总线实际在用的那一套。参数组无效的线路不能启用。工作站拒绝的保存会把卡片回滚成已存下来的值。

## “发现从站”卡片 {#the-discover-units-card}

只对“配置 Connector”、且只在 Modbus RTU 线路上画出来：“在这条已配置的物理线路上依次进行只读探测。”**起始单元 ID** 和**结束单元 ID**（1 到 247，递增；默认 1 到 32）圈定一段范围，探测会用这条线路已保存的参数组去问范围内的每一台从站；**发现设备**启动它，并变成**取消**。字段下面那一行给出最坏情况的估算（“32 次探测 · 最多约 32.1 秒，其中每次探测前静默 4.011 ms。”），或者点出这段范围哪里不对（“单元 ID 范围必须递增。”）。一条已启用、且至少有一台已启用设备的线路正在使用中，卡片会说出来：“这条线路正在使用中。请先禁用它再做设备发现；Ganter Lab 不会自动中断总线，也不会自动把它重新启用。”卡片上还没保存的编辑会在扫描打开端口之前先保存。结果表格**发现的从站**（单元 ID、设备、结果、添加设备或打开）以及扫描本身，都在[设备发现](connector-discovery#modbus-rtu)里讲。

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

“同一条线路上的单元 ID 必须唯一。物理设置继承自线路，在这里无法更改。”**添加设备**会在这条线路上、用 1 到 247 之间第一个空闲的单元 ID 创建一台设备，在这张表格里突出显示并滚动到可见处（“已在‘线路 1’上添加设备‘新建设备’。”）；一个空闲的都没有时它被拒绝，说“线路‘X’已经用满了所有有效的单元 ID。”，扫描期间它置灰。表里列出**设备**、**单元 ID**、**点位**、**健康状态**，以及打开、启用、禁用和删除这几个动作（后三个只对“配置 Connector”出现，扫描期间全部置灰）。设备自己的页面把线路和它的参数组显示为只读文字，见[设备](connector-devices#the-connection-card)。有自身错误的设备，名称后面带着树里同样的红色标记。

在通用驱动或 SCPI 驱动的线路上，卡片写的是“这条线路上的所有设备共用它的端口设置。每个设备在自己的面板中说明其消息如何结束、等待应答多久。”**添加设备**在线路上创建一台该驱动的设备，没有单元 ID，表里也没有**单元 ID**列：需要多少台仪表都可以共用这条线路，靠它们请求的内容区分。

在 Omron 驱动的线路上，卡片显示“这条线路上的所有 PLC 共用它的端口设置，并按各自的单元号应答。每台 PLC 在自己的面板中说明等待应答多久。”**添加设备**在线路上按 0 到 31 中第一个空闲的单元号创建 PLC，复制的设备取下一个空闲的号，表格有**单元 ID**列：一条线路最多由 32 台 PLC 共用，每台按自己的 Host Link 单元号应答。

## 一条线路不做什么 {#what-a-line-does-not-do}

线路不接受文件夹：它的设备只按线路归档，不按别的，设备上也不提供“移动到”菜单。一台设备不能挪到另一条线路上；复制设备会把副本留在同一条线路上，在 Modbus RTU 线路上用下一个空闲的单元 ID。参数组不能按设备各不相同，而且没有设备时端口根本不会打开：一条已启用但没有已启用设备的线路读作“空闲”，不持有任何会话，这也正是能安全扫描它的原因。
