Java连接到OPC服务器:NotConnectedException(AutoReconnectController)
我在通过Java与openScada、Utgard和Jinterop连接OPC服务器时遇到了一个问题 我以前使用Matrikon的OPC服务器(一切都很好),并试图切换到Kepware服务器Ex。Kepware演示版用完了,我不想购买它-因此我决定切换回Matrikon的OPC服务器。我完全卸载了Kepware,在运行我的程序时,没有更改任何代码,我运行到了“org.openscada.opc.lib.common.NotConnectedException” 我已经找到了这个问题的“解决办法”。但它妨碍了程序的原始功能: 最初使用的是AutoReconnect控制器:Java连接到OPC服务器:NotConnectedException(AutoReconnectController),java,wildfly,opc,scada,j-interop,Java,Wildfly,Opc,Scada,J Interop,我在通过Java与openScada、Utgard和Jinterop连接OPC服务器时遇到了一个问题 我以前使用Matrikon的OPC服务器(一切都很好),并试图切换到Kepware服务器Ex。Kepware演示版用完了,我不想购买它-因此我决定切换回Matrikon的OPC服务器。我完全卸载了Kepware,在运行我的程序时,没有更改任何代码,我运行到了“org.openscada.opc.lib.common.NotConnectedException” 我已经找到了这个问题的“解决办法”
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 = new Server(conn, Executors.newSingleThreadScheduledExecutor());
try{
server.connect();
createOPCGroup(tagNames);
}catch (Exception e){
e.printStackTrace(System.out);
}
我得到一个Null值。很明显服务器没有连接,所以我试着移除AutoReconnectController
删除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 = new Server(conn, Executors.newSingleThreadScheduledExecutor());
try{
server.connect();
createOPCGroup(tagNames);
}catch (Exception e){
e.printStackTrace(System.out);
}
NotConnectedException不会触发,程序将成功运行。但是,我需要重新连接功能有人对这里可能发生的事情有什么想法吗?
由于没有代码被更改,我想这是DCOM设置或类似的东西;但是自从Matrikon被换成Kepware,再回来之后,一切都没有改变 AutoReconnectController会异步触发连接过程。服务器类同步工作。由于您没有同步到连接状态,因此状态可能是,也可能不是“null” 但是,AutoReconnectController的“addListener”方法允许您在连接状态下添加侦听器。比如:
autoReconnectController.addListener ( new AutoReconnectListener () {
public void stateChanged ( AutoReconnectState state ) {
if ( state == AutoReconnectState.CONNECTED ) {
createOPCGroup(tagNames);
}
}
} );
autoReconnectController.connect ();
你是一位绅士和学者。谢谢,这解决了我的问题。注意:我必须用一个最终声明来创建标记名,但这并不影响我的程序,因为我只需要加载一次标记名。