使用 OpcNetApi 连接到本地 RSLinx Classic 单节点

Connecting to local RSLinx Classic Single Node using OpcNetApi

我的 C# OPC 客户端使用 OpcNetApi 和 OpcNetApi.Com 并与 RSLinx Classic 单节点安装在同一台机器上。

我的客户端在连接到 RSLinx Classic Gateway 时没有问题,当该版本在同一台机器上使用时。

但是现在我们已经用单节点替换了网关,我收到了来自 OpcNetApi 的以下错误:

E_NETWORK_ERROR 无法连接到服务器。 内部异常:CoCReateInstanceEx:Class 未获得使用许可。

我仔细检查了所有 DCOM 配置,我使用的是标准连接代码:

fact = new OpcCom.Factory();
server = new Opc.Da.Server(fact, null);
url = new Opc.URL("opcda://localhost/RSLinx OPC Server");
server.Url = url;
server.Connect();

我也试过:

server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

但是两者都给我同样的错误。

所以,问题是:如何使用 OpcNetApi/OpcNetApi 从同一台机器上的客户端 运行 连接到本地 RSLinx Classic 单节点.com?

我们认为单节点意味着 OPC 通信被限制在一台设备上,这正是我们正在做的。 . .

请帮忙!

如果您使用的是 64 位机器,解决方案可能是强制您的 .NET 代码在 32 位进程中 运行(例如,通过将项目目标从 AnyCPU 切换到 x86 ,或使用 CORFLAGS 实用程序)。

如果我没记错的话,RSLinx OPC 服务器是在(32 位)DLL 中实现的。当它们在本地被调用时,这个 DLL 应该在 OPC 客户端的进程中 运行。当它检测到其他情况时,它认为它正在被远程使用(在 DCOM 提供的包装进程中),并且当未获得远程使用许可时,会出现此错误。

当 OPC 客户端是本地 64 位进程时,它无法加载 32 位 DLL,并且 DCOM 也会创建包装进程。可怜的 RSLinx 然后认为它 运行s 远程...

谷歌搜索让我想到了这个问题。

我的解决方案最终有点不同,所以我会添加这个答案以防将来对某人有所帮助。

尝试建立本地 OPC 连接失败:

Create Instance Failed: 0x80040112

问题似乎是对 Connect 的调用未能识别出我们正在尝试建立本地连接,而是试图建立远程连接:

string computer = // get it from somewhere, perhaps getting "127.0.0.1" or "localhost"
string server = "RSLinx OPC Server";
var opcServer = new OpcServer();
opcServer.Connect(computer, server);

虽然那真的应该认识到这是一个本地连接,但它没有。所以解决方案是执行以下操作以调用仅用于本地连接的 Connect 方法。

string computer = // get it from somewhere, perhaps getting "127.0.0.1" or "localhost"
string server = "RSLinx OPC Server";
var opcServer = new OpcServer();
if (computer == "127.0.0.1" || computer == "localhost")
{
    opcServer.Connect(server);
}
else
{
    opcServer.Connect(computer, server);
}