# OPC UA 服务器

> 工作站在自己进程里跑着的那个 OPC UA 服务器：它在“服务器”文件夹里的那一行、打开和关闭、重启和测试连接、带 endpoint 和六个计数的状态卡片、一次会话要过的两道检查，以及远程浏览器不可以做什么。

工作站本身就是一台 OPC UA 服务器。它在应用程序的进程里运行，把[提供的节点](connector-opcua-served-nodes)卡片上列出的点位、Logic 变量、报警和设备命令提供在 `opc.tcp://<network name>:4840/UA/GanterLab`（同一台机器上也可以用 `localhost`），其中的名称就是[配置](connector-opcua-configuration)上 **网络名称** 里写的那个，这个字段为空时则是这台计算机自己的名字。网络上的 OPC UA 客户端在那里读取它们，并可以写入标为读写的行；一次写入走的是和其他任何写入相同的 Logic 写入漏斗，所以信号源锁定和运行时的拒绝同样适用。服务器只发布 Connector 读到的东西，自己什么都不读：把它关掉，或者启动时端口被别的程序占着，停下来的只是服务器，Connector、Logic 和记录照常进行。

它那一行是 Connector 上“服务器”文件夹的第一行，它的面板在标题下面说出自己是什么：“把你列出的点位、Logic 变量、报警和设备命令提供给读写它们的 OPC UA 客户端：SCADA 和 MES 系统、历史库、其他工作站。它只接受连接，从不主动连接。”面板上有四张卡片，**状态**、**配置**、**客户端访问** 和 **提供的节点**；查看 Connector 可以读它们，配置 Connector 可以改动它们。在 **提供的节点** 有行之前，服务器不提供本工作站的任何内容。

## 打开还是关闭 {#on-or-off}

服务器有自己的开关，在新工作站上它是关着的：在有人把服务器打开之前，端口 4840 一直关着。一旦打开，它每次都随应用程序一起启动，窗口藏在托盘里时也照样服务，直到有人把它关掉。从没有这个开关的版本更新过来的工作站，保留它的客户端原有的情况：原本接受会话的服务器保持打开，而客户端认证原本是“已禁用”、拒绝每一次会话的服务器则被关闭。代理用 `server_start` 和 `server_stop` 拨动同一个开关（见[代理工具](agent-tools)）。

## 抬头 {#the-header}

面板的抬头带着一个圆点和服务器的状态，用的是它那一行上的同样字眼：

| 状态 | 圆点 | 何时 |
| --- | --- | --- |
| “已关闭” | 灰色 | 开关是关着的，不管别的发生了什么。 |
| “正在端口 4840 上监听” | 绿色 | 服务器开着，它的地址空间是活的。那一行还会加上已连接的客户端：“没有已连接的客户端”、“已连接 1 个客户端”、“已连接 3 个客户端”。 |
| “正在启动…” | 琥珀色 | 从一次启动到那一刻之间，以及它所发布的 Connector 正在起来的时候。 |
| “无法启动” | 红色 | 服务器开着，而它上一次启动失败了，通常是因为别的程序占着端口。状态卡片在 endpoint 下面说明原因。 |
| “Connector 已停止” | 灰色 | 服务器开着，但 Connector 运行时没有在跑。 |

这个状态只属于服务器。不管服务器在不在跑，Connector 都在读设备，而状态栏和托盘替 Connector 说话；见[托盘和状态栏](#the-tray-and-the-status-bar)。

## 命令 {#the-commands}

面板上方的命令栏放着服务器的动词，和 Modbus 服务器一样。

| 命令 | 作用 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| 启用 | 打开服务器并启动它，提供它的列表；Connector 不重启（它根本没在跑时，先把它启动起来）。状态栏先显示“正在启动 OPC UA 服务器…”，再显示“OPC UA 服务器已打开。正在 `<endpoint>` 上监听。”。启动失败时服务器保持打开、显示“无法启动”，操作记录条说明原因：“OPC UA 服务器错误：`<原因>`”，或者在服务器只是把它记下来时显示“OPC UA 服务器启动失败。它可能无法绑定端口 N。请查看日志。”。 | 服务器开着的时候（“服务器已经打开。”）、服务器的另一条命令正在执行的时候（“另一条服务器命令仍在执行。”），以及工作站拒绝配置的时候。 | 角色没有 **配置 Connector** 的时候。 |
| 禁用 | 关闭服务器并优雅地停掉它：每一个客户端会话都结束，在启用之前什么都不发布。Connector 照样在读设备，Logic 和记录照常进行。先是“正在停止 OPC UA 服务器…”，再是“OPC UA 服务器已关闭。” | 服务器关着的时候（“服务器已经关闭。”），以及同样那两种情形。 | 同上。 |
| 重启 | 停掉服务器，再按正在生效的配置把它启动起来；Connector 全程都在读。先是“正在重启 OPC UA 服务器…”，再是“OPC UA 服务器已重启。”，或者上面那句失败的话。 | 服务器关着的时候（“服务器已关闭：点‘启用’即可打开。”），以及同样那两种情形。 | 同上。 |
| 测试连接 | 报告工作站对自己那台服务器所知道的情况，不做任何改动：“OPC UA 服务器没有在监听，任何客户端都无法连接。”、“OPC UA 服务器正在启动，还没有就绪。”，或者“OPC UA 服务器在 `<endpoint>` 上可达，有 N 个活动会话。”这是正在运行的进程自己的说法，不是隔着网络去探测。 | 从不。 | 从不。 |

有单元在运行时（“有单元在运行时配置是锁住的。”）以及运行时停着时，工作站拒绝配置：停掉现场的服务器是配置工作，不是操作。一次没有报错就返回的启动也会再核对一遍，因为 OPC UA 协议栈可能绑定端口失败却只把这件事记下来，所以操作记录条报告的是失败，而不是成功。

## 状态卡片 {#the-status-card}

卡片显示网络上的客户端要连接的 endpoint `opc.tcp://<network name>:<port>/UA/GanterLab`，它始终是一个稳定的名字，绝不会是 `0.0.0.0` 或者一个 DHCP 地址；同一台机器上用的另一条路在[客户端访问](connector-opcua-client-access)的连接地址下面。服务器开着却没能启动时，原因写在 endpoint 下面的一条警示注释里。再往下是六个计数，每秒重画一次：

| 计数 | 它数的是什么 |
| --- | --- |
| 运行时长 | 服务器上次启动以来的时间，写成 `2h 14m 5s`、`14m 5s` 或者 `5s`；停着的时候是一个空缺记号。同一个时刻也喂着 Logic 地址空间的 Server.StartTime 和 Server.Uptime 两个点位。 |
| 会话 | 服务器此刻已经接受的那些客户端会话，和[客户端访问](connector-opcua-client-access)上“当前已连接”显示的是同一份名单。 |
| 设备 | [Connector](connector) 里配置好的设备，跨所有驱动，启用与否都算。 |
| 驱动 | 这些设备一共用到了多少种不同的驱动。 |
| 错误 | 通信宿主日志流里的错误行（服务器和驱动）。这个流保留最近 500 行；数字不为零时变红。 |
| 警告 | 同一个流里的警告行，不为零时是警示色调。对持有**查看事件**的角色，这个数字是一个按钮，在工作站自己的桌面上打开拆出去的事件窗口（“打开事件窗口”）；在另一台设备的浏览器里它变灰，写着“仅在工作站本机的桌面应用中可用。”；对没有这项权限的角色，它就是一个普通数字。 |

## 两道检查，分得清清楚楚 {#two-checks-kept-apart}

一次 OPC UA 会话要过两道检查，这个面板分别设置它们。[客户端访问](connector-opcua-client-access)上的 **证书信任** 决定一个应用程序究竟能不能够到服务器：未知的证书在它第一次尝试时就被拒绝，留下来等你审核，什么都不会被自动信任，要核对的身份是指纹，而绝不是证书自称的名字。然后，[配置](connector-opcua-configuration)上的 **客户端认证** 决定一个受信任的应用程序怎样登录：匿名，也就是默认值，或者用配置好的那唯一一对用户名和密码。同样的想法在 [OPC UA 驱动页面](driver-opc-ua#equipment-access)上朝另一个方向起作用：证书你没有批准的 OPC UA 现场设备，工作站一个数都不读。

## 托盘和状态栏 {#the-tray-and-the-status-bar}

服务器的实时状态在它那一行和它的面板上读。状态栏上的健康状态行、托盘图标、它的提示文字和它菜单里的那一行，改为替 [Connector](connector-health) 说话，也就是替它读的那些设备说话，因为一台关着的服务器不耽误任何读取，也不是盯着工作站的人需要知道的事。是否在运行、启动时刻、运行时长和会话数，也是 [Logic](logic-from-other-pages) 地址空间里它的 Server 根节点下的点位（Running、StartTime、Uptime、SessionCount），所以仪表画面或者表达式都可以读它们。

工作站带着打开的服务器启动、而服务器打不开它的端口时，窗口会弹出“服务器无法启动”这张卡片，带着 **使用端口 4841** 和 **打开 Connector**；见[配置](connector-opcua-configuration#when-the-server-cannot-open-its-port-at-start)。这里每一条命令的结果都落到状态栏的操作记录条上，每一次关于证书的拒绝和决定都会记进日志：服务器自己的日志行在[事件](events-console)的控制台标签页上，而它们的错误数和警告数就是状态卡片上最后那两个计数。

## 远程浏览器不可以做什么 {#what-a-remote-browser-may-not-do}

另一台设备上的浏览器，用持有配置 Connector 的角色，看到的这个面板和工作站的窗口完全一样，并且可以打开和关闭服务器、重启它、应用一份配置。它不可以做的是对证书作决定：添加客户端、信任、阻止、撤销、取消阻止、丢弃所有待处理的证书、导入证书和那个 Windows 防火墙按钮，在那里都会被拒绝，写着“客户端访问只能在工作站本机的桌面应用中更改。”，卡片上的一条提示条也这么说：“要更改客户端访问，请打开桌面应用”。警告计数通往独立事件窗口的那个入口会变灰，写着“仅在工作站本机的桌面应用中可用。”。

证书放在哪里：服务器自己的应用程序证书，以及受信任、待审核和被阻止的客户端证书库，都在工作站数据根目录下的 `ua\pki` 里，现场设备的那些库在 `ua\pki\southbound` 里。它们挺过重启，而且不属于配置[备份](settings-backups)的一部分。

## 这个面板不做什么 {#what-this-panel-does-not-do}

它不断开单独一次会话（在客户端访问上撤销一份证书才会这样），不清零日志计数（日志流有上限，会自己滚动），不停止 Connector 的读取，也不重启应用程序。失败之后它从不自己再把服务器启动起来：一次失败的启动会被报告出来，等你按重启，或者等你在卡片上挑一个端口。endpoint 在[配置](connector-opcua-configuration)上改，而且只在服务器没有监听时才能改。
