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

时间:2015-12-18 03:15:08

标签: automation opc

我的C#OPC客户端使用OpcNetApi和OpcNetApi.Com,并且与RSLinx Classic Single Node在安装在同一台计算机上

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

但是现在我们用单节点取代了Gateway,我收到了来自OpcNetApi的以下错误:

E_NETWORK_ERROR无法连接到服务器。 内部例外:CoCReateInstanceEx:类未获许可使用。

我已经仔细检查了所有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.Com从同一台机器上运行的客户端连接本地RSLinx Classic Single Node?

我们认为单节点意味着OPC通信仅限于一台设备,这正是我们正在做的事情。 。

请帮忙!

2 个答案:

答案 0 :(得分:1)

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

如果我记得很清楚,RSLinx OPC服务器是在(32位)DLL中实现的。当它们在本地调用时,此DLL期望在OPC客户端的进程内运行。当它另外检测到时,它认为它正被远程使用(在DCOM提供的包装过程中),并且当没有获得远程使用许可时,会出现此错误。

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

答案 1 :(得分:0)

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

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

尝试建立本地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);
}