5

問題を解決する解決策が見つからなかったため、新しいトピックを開始しています。

Utgard ( http://openscada.org/projects/utgard ) は、私にとって非常に便利なツールのようです。このフェーズでは、Eclipse を介して Windows 8 OS でローカルに 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]
4

2 に答える 2

4

ローカルの Windows レジストリにアクセスできないため、クライアントはサーバーの ProgID を CLSID に変換できません。十分な権限でアプリケーションを実行していることを確認してください。つまり、管理者ユーザーであることを確認してください。

または、サーバーの CLSID を使用して接続を構成するだけでよいため、レジストリは必要ありません。

OPC クライアントは、サーバー コンピューターで実行されている OpcEnum サービスを実際に使用して、ProgID から CLSID への変換を行う必要があります。おそらく、サービスが利用できないか、Utgard はレジストリのみを試行します (Utgard 自体はわかりません)。サーバーがクライアント マシンにインストールされていない場合、レジストリ ベースの ProgID から CLSID への変換は失敗します。これは、その情報がローカルの Windows レジストリで利用できないためです。最悪の場合、Utgard はリモートの Windows レジストリを開こうとしますが、成功することはめったにありません (または、個別に有効にする必要があります)。

私はウトガルドを知らないので、それがどのような戦略を試みているかを推測しているだけであることに注意してください. それにもかかわらず、CLSID のみを使用すると、変換部分全体がバイパスされます。これが問題です。

E: あなたの他のクライアントが問題なく接続できることを考えると、Utgard は OpcEnum をまったく使用しようとしないと思われます。

于 2013-08-08T07:30:26.693 に答える