gpt4 book ai didi

java - Utgard - 访问被拒绝

转载 作者:搜寻专家 更新时间:2023-10-31 20:03:25 26 4
gpt4 key购买 nike

我一直无法找到解决我的问题的解决方案,所以我打开了一个新主题。

Utgard ( http://openscada.org/projects/utgard ) 对我来说似乎是一个非常有用的工具。在这个阶段,我只想能够通过 Eclipse 在 Windows 8 操作系统上本地访问 TOP OPC 服务器。但是,当尝试运行他们的教程时,我最终得到了“访问被拒绝”。我不认为我在用户名、密码等方面有任何错误。

Exele OPC DA 测试客户端不返回任何错误。我可以连接、检索和重写值。

请注意,我是 OPC 和 OpenSCADA 方面的新手。任何帮助将不胜感激。

package org.openscada.opc.tutorial;
import java.util.concurrent.Executors;
import org.jinterop.dcom.common.JIException;
import org.openscada.opc.lib.common.ConnectionInformation;
import org.openscada.opc.lib.da.AccessBase;
import org.openscada.opc.lib.da.DataCallback;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;

public class UtgardTutorial1 {


public static void main(String[] args) throws Exception {
// create connection information
final ConnectionInformation ci = new ConnectionInformation();
//final ConnectionInformation connectionInformation = new ConnectionInformation();
ci.setHost("127.0.0.1");
//ci.setDomain("");
ci.setUser("Me");
ci.setPassword("Password");
ci.setProgId("SWToolbox.TOPServer.V5");
//ci.setClsid("680DFBF7-C92D-484D-84BE-06DC3DECCD68"); // if ProgId is not working, try it using the Clsid instead
// create an id for the tag you want to retrieve
final String itemId = "_System._Time_Second";
// create a new server
final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
//final Server serverServer = new Server(connectionInformation, Executor.newSingleThreadSchedulesExecutor);

try {
// connect to server
server.connect();
// add sync access, poll every 500 ms
final AccessBase access = new SyncAccess(server, 500);
access.addItem(itemId, new DataCallback() {
@Override
public void changed(Item item, ItemState state) {
System.out.println(state);
}
});
// start reading
access.bind();
// wait a little bit
Thread.sleep(10 * 1000);
// stop reading
access.unbind();
} catch (final JIException e) {
System.out.println(String.format("%08X: %s", e.getErrorCode(), server.getErrorMessage(e.getErrorCode())));
}
}

错误堆栈跟踪:

INFO  org.openscada.opc.lib.da.Server - Failed to connect to server
org.jinterop.dcom.common.JIException: Access is denied, please check whether the [domain-username-password] are correct. Also, if not already done please check the GETTING STARTED and FAQ sections in readme.htm. They provide information on how to correctly configure the Windows machine for DCOM access, so as to avoid such exceptions. [0x00000005]
at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenKey(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
at org.jinterop.dcom.core.JIProgId.getIdFromWinReg(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
at org.jinterop.dcom.core.JIProgId.getCorrespondingCLSID(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
at org.jinterop.dcom.core.JIComServer.<init>(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
at org.openscada.opc.lib.da.Server.connect(Server.java:123) ~[org.openscada.opc.lib_1.0.0.201303051455.jar:na]
at org.openscada.opc.tutorial.UtgardTutorial1.main(UtgardTutorial1.java:32) [bin/:na]
Caused by: org.jinterop.dcom.common.JIRuntimeException: Access is denied, please check whether the [domain-username-password] are correct. Also, if not already done please check the GETTING STARTED and FAQ sections in readme.htm. They provide information on how to correctly configure the Windows machine for DCOM access, so as to avoid such exceptions. [0x00000005]
at org.jinterop.winreg.IJIWinReg$openKey.read(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
at ndr.NdrObject.decode(Unknown Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]
at rpc.ConnectionOrientedEndpoint.call(Unknown Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]
at rpc.Stub.call(Unknown Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]

最佳答案

您无权访问本地 Windows 注册表,因此客户端无法将服务器的 ProgID 转换为 CLSID。确保您在其中以足够的权限运行应用程序,即您是管理员用户。

或者,您可以只使用服务器的 CLSID 配置连接,这样就不需要注册表。

OPC 客户端实际上应该使用在服务器计算机上运行的 OpcEnum 服务来执行 ProgID 到 CLSID 的转换。也许该服务不可用或 Utgard 仅尝试注册表(我自己不了解 Utgard)。如果您没有在客户端计算机上安装服务器,则基于注册表的 ProgID 到 CLSID 的转换无论如何都会失败,因为该信息在本地 Windows 注册表中不可用。最坏的情况是 Utgard 会尝试打开远程 Windows 注册表,这很少会成功(或者您需要确保单独启用它)。

请注意,由于我不了解 Utgard,所以我只是在猜测它正在尝试的策略。然而,仅使用 CLSID 将绕过整个转换部分,这是您的问题。

E:考虑到您的其他客户端可以毫无问题地连接,我怀疑 Utgard 根本没有尝试使用 OpcEnum。

关于java - Utgard - 访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18076924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com