Соединение Java с сервером OPC: NotConnectedException (AutoReconnectController)

Я столкнулся с проблемой подключения к OPC-серверу через Java с помощью openScada, Utgard и Jinterop.

Ранее я использовал OPC-сервер Matrikon (все работало отлично) и пытался перейти на Kepware Server Ex. Демоверсия Kepware закончилась, и я не хотел ее покупать - поэтому я решил вернуться к OPC-серверу Matrikon. Я полностью удалил Kepware и, не меняя никакого кода, натолкнулся на "org.openscada.opc.lib.common.NotConnectedException" при запуске моей программы.

Я нашел "обходной путь" для этой проблемы. Но это мешает оригинальной функциональности программы:изначально использовался AutoReconnectController:

  public void createOPCConnection( String host, String domain, String progID, String clsid, List<String>tagNames) throws OPCException {   

  this.conn = new ConnectionInformation();
    conn.setHost(this.host);
    conn.setDomain(this.domain);
    conn.setUser(this.user);
    conn.setPassword(this.pass);
    conn.setProgId(this.progID);
    conn.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305");


    server = new Server(conn, Executors.newSingleThreadScheduledExecutor());        
    AutoReconnectController autoReconnectController = new AutoReconnectController ( server );
    // disable GC for COM objects to prevent the socket from being closed
    JISystem.setJavaCoClassAutoCollection(false);

    try {
        // connect to server
        autoReconnectController.connect();
        createOPCGroup(tagNames);

    } catch (IllegalArgumentException e) {
        throw new OPCException(e.getMessage());

    }

При тестировании состояния сервера с помощью

  server.getServerState() 

Я получаю значение Null. Очевидно, что сервер не подключался, поэтому я попытался удалить AutoReconnectController.

При удалении AutoReconnectController, как таковой:

  server = new Server(conn, Executors.newSingleThreadScheduledExecutor());
   try{
        server.connect();
        createOPCGroup(tagNames);
    }catch (Exception e){
    e.printStackTrace(System.out);
    }

NotConnectedException не запускается, и программа работает успешно. Однако мне нужна функциональность переподключения. У кого-нибудь есть мысли о том, что здесь может происходить?

Поскольку никакой код не был изменен, я решил, что это были настройки DCOM или что-то в этом роде; но опять ничего не изменилось с тех пор, как Матрикон был изменен на Kepware, и обратно.

1 ответ

Решение

AutoReconnectController запускает процесс подключения асинхронно. Класс Server работает синхронно. Поскольку вы не синхронизируете данные с состоянием соединения, состояние может быть или не быть "нулевым".

Однако метод "addListener" в AutoReconnectController позволяет добавлять прослушиватель в состояние соединения. Что-то вроде:

autoReconnectController.addListener ( new AutoReconnectListener () {
   public void stateChanged ( AutoReconnectState state ) {
       if ( state == AutoReconnectState.CONNECTED ) {
           createOPCGroup(tagNames);
       }
   }
} );
autoReconnectController.connect ();
Другие вопросы по тегам