2014-11-17 4 views
1

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

Я ранее использовал 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(); 
+0

Вы джентльмен и ученый. Спасибо, что исправил мою проблему. Примечание: Мне нужно было сделать мои имена тегов с окончательным объявлением, но это не повлияло на мою программу, так как мне нужно только один раз загрузить теги tagNames. – ballBreaker

 Смежные вопросы

  • Нет связанных вопросов^_^