从容器化客户端应用程序连接到 OPC-UA 服务器

问题描述 投票:0回答:1

我正在尝试编写需要连接到 OPC-UA 服务器的软件。该软件托管在 Docker 容器内,OPC-UA 服务器最终将成为我公司使用的 PLC 中嵌入的服务器。目前,我正在尝试使用在我的 Windows PC 上本机运行的 Prosys OPC-UA 模拟服务器。我使用的是最新版本的 Docker Desktop,并且启用了 WSL2 模式(而不是使用 Hyper-V)。这是一个 .NET 应用程序 (.NET 6),使用 OPCFoundation.NetStandard.Opc.Ua nuget 包来处理与 UA 服务器的通信。我还可以确认 .NET UA 库读取的 XML 配置文件位于软件期望的位置(EXE 的根目录)。

在 docker 环境之外运行,我可以使用

opc.tcp://<my_windows_ip>:53530/OPCUA/SimulationServer
的连接字符串完美地连接到 Prosys UA 服务器。一旦我创建了一个 docker 映像并创建了一个容器并尝试连接到服务器,它就会失败。我试过了

  • host.docker.internal 为主机名
  • Linux 172.17.0.1 地址(应该是主机 PC 的地址)
  • Prosys 连接字符串原样
    • opc.tcp://:53530/OPCUA/SimulationServer
  • 127.0.0.1(我预计无论如何都不会工作)
  • docker-compose.yml
    文件中尝试不同的端口映射
  • 连接到具有嵌入式 UA 服务器的实际 PLC

每一次尝试都失败了。我试图通过编写一个在我的计算机上本机运行的非常简单的 TCP 侦听器应用程序来排除 OPC,并向 docker 中包含的应用程序添加 ASP.NET 路由,该路由通过 TCP 向不在 docker 中运行的应用程序发送消息。我让它听

0.0.0.0:13000
,我的应用程序由连接到它的 Docker 容器托管。

我已经这样做了快一周了,但我不知道下一步该做什么。令我惊讶的是,我无法连接到拥有自己服务器的实际 PLC。

.net docker asp.net-core opc-ua
1个回答
0
投票

我发现客户端在尝试创建会话时正在连接到服务器。该问题与 Docker 镜像有关。我们使用 Linux 镜像作为容器,并将编译后的程序复制到 images

/app
文件夹中。我们还在图像中添加一个用户。该用户没有对
/app
文件夹的写入权限。这意味着我使用的 OPCUA API 无法创建文件夹并将服务器发送的证书写入文件系统。正在抛出一个
System.IO.IOException

我将

/app
文件夹的所有权更改为该创建的用户(也是递归地),并确保该用户对该文件夹具有读取和写入权限。一旦我这样做了,一切就都正常了。

© www.soinside.com 2019 - 2024. All rights reserved.