【发布时间】:2017-12-22 21:56:00
【问题描述】:
我目前正在使用来自 OPC Labs 的 QuickOPC 库。我目前的目的是编写一个 .NET 控制台应用程序来从 Matrikon Simulation OPC 服务器读取项目值。
模拟服务器正在远程机器上运行,IP地址可用,我需要输入用户名和密码才能登录到这台远程机器。
我目前的代码如下:
NetworkSecurity networkSecurity = new NetworkSecurity(UserName, Password, MachineName);
ServerDescriptor serverDescriptor = new ServerDescriptor("\\\\xxx.xxx.xxx.xxx\\Matrikon.OPC.Simulation.1", networkSecurity);
serverDescriptor.Scheme = "opcda";
DAItemDescriptor itemDescriptor = new DAItemDescriptor(ItemID);
Console.WriteLine(client.ReadItemValue(serverDescriptor, itemDescriptor));
例外情况如下:
异常:OPC 操作失败,错误代码为 -1073442759 (0xC0049039) occ urred,源自 'OpcLabs.EasyOpcRaw.DataAccess.RawEasyDAClient'。内在的例外 包含有关问题的详细信息。内部异常:没有方法 可用于将 ProgID 转换为 CLSID。
如果我尝试使用 CLSID
ServerDescriptor("\\\\xxx.xxx.xxx.xxx\\{F8582CF2-88FB-11D0-B850-00C0F0104305}", networkSecurity);
异常变成:
异常:OPC 操作失败,错误代码为 -2147024891 (0x80070005) occ urred,源自 'OpcLabs.EasyOpcRaw.DataAccess.RawEasyDAClient'。内在的例外 包含有关问题的详细信息。内部异常:访问被拒绝。
【问题讨论】:
-
我代表 OPC Labs,一家 QuickOPC 制造商。正如其他用户在此处的答案和 cmets 中指出的那样,这是一个 DCOM 安全问题。为了解释最初的错误信息,如果 OPCEnum 方法不起作用,QuickOPC 还会尝试使用所谓的 Remote Registry 解析 ProgID。如果没有方法成功,您会收到此错误消息。如果您的管理员不愿意启用 DCOM,他很可能也不愿意启用远程注册表 - 而且,无论如何,您仍将 DCOM 用于实际的 OPC 通信。
-
@ZbynekZ 感谢您的回复。您的回答绝对有道理,尽管我们决定将我的 OPC 客户端安装在服务器的同一台机器上。因此,它现在可以在不启用 DCOM 的情况下正常工作。