OPC UA 服务器

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

以 Markdown 查看

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

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

打开还是关闭

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

抬头

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

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

这个状态只属于服务器。不管服务器在不在跑,Connector 都在读设备,而状态栏和托盘替 Connector 说话;见托盘和状态栏。

命令

面板上方的命令栏放着服务器的动词,和 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 协议栈可能绑定端口失败却只把这件事记下来,所以操作记录条报告的是失败,而不是成功。

状态卡片

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

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

两道检查,分得清清楚楚

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

托盘和状态栏

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

工作站带着打开的服务器启动、而服务器打不开它的端口时,窗口会弹出“服务器无法启动”这张卡片,带着 使用端口 4841 和 打开 Connector;见配置。这里每一条命令的结果都落到状态栏的操作记录条上,每一次关于证书的拒绝和决定都会记进日志:服务器自己的日志行在事件的控制台标签页上,而它们的错误数和警告数就是状态卡片上最后那两个计数。

远程浏览器不可以做什么

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

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

这个面板不做什么

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