2013-08-06 36 views
5

Non riesco a trovare una soluzione che corregge il mio problema, quindi sto aprendo un nuovo argomento.Utgard - Accesso negato

Utgard (http://openscada.org/projects/utgard) mi sembra uno strumento molto utile. In questa fase voglio solo essere in grado di accedere al server OPC TOP localmente su un sistema operativo Windows 8 tramite Eclipse. Tuttavia, quando provo a eseguire il loro tutorial, finisco con un "Accesso negato". Non penso di aver commesso errori con nome utente, password e così via.

Il client di test DA OPC DA Exele non restituisce alcun errore. Posso connettere, recuperare e riscrivere i valori.

Si prega di notare che io sono un principiante quando si tratta di OPC e OpenSCADA. Qualsiasi aiuto sarà molto apprezzato.

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()))); 
    } 
} 

}

errore di stack trace:

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] 
+0

avete controllato impostazioni DCOM del server OPC? –

+0

Ciao claptrap, grazie per la tua risposta! Sì, ho controllato le impostazioni DCOM più di una volta guidato da molti articoli diversi su Internet. Immagino che non siano il problema. È solo nel mio IDE che ottengo questi errori. – user2656046

+0

ah ok, buona fortuna a trovare il problema. –

risposta

4

Lei non hanno accesso al registro di Windows locale, quindi il cliente non riesce a convertire ProgID del server per CLSID. Assicurati di eseguire l'applicazione con privilegi sufficienti, ad esempio che sei un utente amministratore.

In alternativa, è sufficiente configurare la connessione utilizzando il CLSID del server, quindi non è necessario il registro.

Un client OPC deve effettivamente utilizzare il servizio OpcEnum in esecuzione sul computer server per eseguire la conversione da ProgID a CLSID. Forse il servizio non è disponibile o Utgard cerca solo il registro (non conosco Utgard me stesso). Se il server non è installato sul computer client, la conversione da ProgID a CLSID basata sul registro fallirà comunque, dal momento che tali informazioni non sono disponibili nel registro di Windows locale. Il caso peggiore è che Utgard proverà ad aprire il registro di Windows remoto, che riesce solo raramente (o è necessario assicurarsi che sia abilitato separatamente).

Nota che come non conosco Utgard, sto solo indovinando quali strategie sta tentando. Tuttavia, l'utilizzo del solo CLSID eviterà l'intera parte di conversione, che è il tuo problema.

E: Considerando che l'altro client può connettersi senza problemi, sospetto che Utgard non provi affatto a utilizzare OpcEnum.

+0

Ciao Jouni Aro, grazie per la tua chiara spiegazione. Stabilirò la tua risposta come risposta accettata perché ho sentito che questo è un problema comune e aiuterà molte persone. Tuttavia, ho risolto il problema alterando ancora una volta le impostazioni DCOM come suggerito da claptrap. Questa volta ho impostato "posizione" su "Esegui l'applicazione dal seguente computer" myComputerName "" invece di "Esegui applicazione da questo computer". Non so perché, ma ora funziona bene. – user2656046

+0

Sto anche usando il CLSID come hai detto! Ma questo di per sé non ha fatto andare via l'eccezione. Ho anche dovuto cambiare il DCOM come spiegato nel mio commento precedente. – user2656046

+1

Ciao, potresti per favore estendere la configurazione DCOM che hai usato. – Kumait

0

ho ottenuto lo stesso errore, e risolvere il problema applicando la seguente patch al Registro di sistema:

  • HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion Policies \ System \
  • creare o modificare 32 DWORD bit: LocalAccountTokenFilterPolicy
  • impostare il valore a: 1