Соединение 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 ();