SuperAPI AI 工具集

matlab-discover-opcua-servers

部署与运维

查看项目

更新于 10-16 04:42

技能介绍

用途

本技能用于在 MATLAB 中发现可用的 OPC UA 服务器。通过 opcuaserverinfo 函数,可以查询 OPC UA 本地发现服务(LDS)或指定的发现端点,获取服务器信息,为后续建立 OPC UA 客户端连接做准备。

主要能力

  • 通过 LDS 发现网络上所有已注册的 OPC UA 服务器。
  • 通过发现 URL 直接查询特定已知服务器。
  • 获取服务器的发现 URL 或端点信息。
  • 查询服务器的安全策略与支持的认证类型。
  • 排查发现结果为空的问题(LDS 问题、证书信任)。
  • 设置 OPC UA 服务器发现的前置条件。

使用方式

1. 检查前置条件

在调用 opcuaserverinfo 之前,需确保:

  • OPC UA 本地发现服务(LDS)已安装并运行。
  • 目标服务器已注册到 LDS。
  • 服务器证书已被 LDS 证书存储信任,路径为 C:\ProgramData\OPC Foundation\UA\pki\trusted\certs\。

注意:UA\Discovery\ 下也可能存在 pki\ 文件夹,这是旧版 LDS 部署的向后兼容回退路径。主存储为 UA\pki\,证书应始终放在 UA\pki\trusted\certs\。

2. 发现服务器

首选方式——基于 LDS 的发现(查找所有已注册服务器):

serverInfo = opcuaserverinfo('localhost');

使用主机名调用一次 opcuaserverinfo 会查询该主机 4840 端口上的 LDS。LDS 返回所有注册到它的服务器信息。不要扫描 IP 范围或遍历主机——LDS 已聚合这些信息。

替代方式——直接端点发现(已知服务器 URL 时):

serverInfo = opcuaserverinfo('opc.tcp://myserver:53530/OPCUA/SimulationServer');

当连接特定已知服务器(可能未注册到 LDS)或 LDS 不可用时使用此方式。

3. 查看结果

for k = 1:numel(serverInfo)
    fprintf('Server: %s (port %d)\n', serverInfo(k).Hostname, serverInfo(k).Port);
    fprintf('  Best security: %s / %s\n', ...
        serverInfo(k).BestMessageSecurity, serverInfo(k).BestChannelSecurity);
    fprintf('  Endpoints: %d available\n', numel(serverInfo(k).Endpoints));
end

4. 连接到已发现的服务器

uaClient = opcua(serverInfo(1));
connect(uaClient);

opcua() 函数可直接接受 ServerInfo 对象,无需手动提取主机名和端口。

关键函数

函数 语法 用途
opcuaserverinfo opcuaserverinfo(hostname) 查询主机上的 LDS 以获取所有已注册服务器
opcuaserverinfo opcuaserverinfo(discoveryUrl) 查询特定发现端点 URL
opcua opcua(serverInfoObj) 从 ServerInfo 对象创建客户端
findDescription findDescription(serverInfo, text) 按描述文本过滤服务器
findAuthentication findAuthentication(serverInfo, type) 按认证类型过滤服务器

不存在 opcuaserverinfo(hostname, port) 语法。要指定端口,请使用发现 URL 形式:opcuaserverinfo('opc.tcp://hostname:port')。

opc.ua.ServerInfo 属性

属性 类型 描述
Hostname char OPC UA 服务器的主机名
Port double 连接用的 TCP 端口
Description char 人类可读的服务器描述
UserTokenTypes cell array 支持的认证类型(如 {'Anonymous', 'Username', 'Certificate'})
BestMessageSecurity enum 最高消息安全级别:SignAndEncrypt、Sign 或 None
BestChannelSecurity enum 最高通道安全策略
Endpoints array opc.ua.EndpointDescription 对象数组

注意:opc.ua.ServerInfo 有 Description 属性,没有 Name 属性。Name 属性属于 opc.ua.Client,不属于 ServerInfo。

opc.ua.EndpointDescription 属性

属性 类型 描述
EndpointUrl char 用于连接的完整端点 URL
MessageSecurityMode enum 此端点的安全模式
ChannelSecurityPolicy enum 此端点的通道安全策略
UserAuthTypes cell array 此端点支持的认证类型

常用模式

通过 LDS 发现所有服务器:

serverInfo = opcuaserverinfo('localhost');
if isempty(serverInfo)
    disp('No servers found. Check LDS prerequisites.');
else
    disp(serverInfo);
end

通过 URL 发现特定服务器:

serverInfo = opcuaserverinfo('opc.tcp://myserver:53530/OPCUA/SimulationServer');
disp(serverInfo);

按认证类型过滤服务器:

serverInfo = opcuaserverinfo('localhost');
anonServers = findAuthentication(serverInfo, 'Anonymous');
certServers = findAuthentication(serverInfo, 'Certificate');

将发现结果传给 opcua() 进行连接:

serverInfo = opcuaserverinfo('localhost');
uaClient = opcua(serverInfo(1));
connect(uaClient);

常见错误

错误 原因 正确做法
opcuaserverinfo(host, port) 不存在双参数语法 opcuaserverinfo('opc.tcp://host:port')
循环扫描子网 IP LDS 已聚合所有已注册服务器 opcuaserverinfo('localhost') 返回所有服务器
使用 serverInfo.Name ServerInfo 上不存在该属性 使用 serverInfo.Description
使用 serverInfo.EndpointUrl 该属性属于 opc.ua.Client,不属于 ServerInfo 使用 serverInfo.Endpoints(k).EndpointUrl
假设空结果意味着 LDS 宕机 空结果也可能表示没有服务器注册或证书不受信任 先运行 sc query UALDS 确认 LDS 状态,再检查注册和信任
使用 UA\Discovery\pki\ 作为证书存储 Discovery\pki\ 是向后兼容回退路径(只有 trusted\),不是主存储 LDS 主证书存储在 C:\ProgramData\OPC Foundation\UA\pki\(同时有 trusted\ 和 rejected\)——检查 rejected\certs\ 中的不受信任证书,复制到 trusted\certs\ 以信任它们
未提及 LDS 前置条件 未正确设置时发现返回空 始终检查:LDS 运行、服务器已注册、证书受信任

约定

  • 在查找网络上所有服务器时,始终优先使用基于 LDS 的发现(opcuaserverinfo(hostname)),而非直接端点查询。
  • 讨论发现设置时,始终提及三个 LDS 前置条件。
  • 显示时使用 serverInfo.Description,而非 Name(后者不存在)。
  • 直接将 ServerInfo 对象传给 opcua(),不要手动提取主机名/端口。
  • 当发现返回空时,不要假设 LDS 宕机——先通过 sc query UALDS 验证,再检查服务器注册,最后检查证书信任(按此顺序)。

适用场景

  • 查找本地网络上可用的 OPC UA 服务器。
  • 获取已知服务器的发现 URL 或端点信息。
  • 查询服务器安全策略和支持的认证类型。
  • 排查发现结果为空的问题(LDS 问题、证书信任)。
  • 设置 OPC UA 服务器发现的前置条件。

限制

以下情况不适用本技能:

  • 创建 OPC UA 客户端连接(直接使用 opcua())。
  • 读取、写入或订阅 OPC UA 节点值。
  • 配置 OPC UA 连接安全(消息安全、证书)。
  • 处理非 OPC UA 协议(Modbus、MQTT)。
  • 发现 OPC Classic 服务器(OPC DA、OPC HDA)。