用途
本技能用于在 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)。