Java连接到OPC服务器:NotConnectedException(AutoReconnectController)

时间:2014-11-17 17:46:17

标签: java wildfly opc scada j-interop

我遇到了一个问题,通过Java与openScada,Utgard和Jinterop连接到OPC服务器。

我之前使用的是Matrikon的OPC服务器(一切运行正常),并尝试切换到Kepware Server Ex。 Kepware演示用完了,我不想购买它 - 所以我决定切换回Matrikon的OPC服务器。我完全卸载了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设置或类似的东西;但是,自从Matrikon改为Kepware之后再没有任何改变。

1 个答案:

答案 0 :(得分:1)

AutoReconnectController确实异步触发连接过程。 Server类同步工作。由于您没有同步到连接状态,因此状态可能是,也可能不是“null”。

然而,AutoReconnectController的“addListener”方法允许您在连接状态上添加侦听器。类似的东西:

autoReconnectController.addListener ( new AutoReconnectListener () {
   public void stateChanged ( AutoReconnectState state ) {
       if ( state == AutoReconnectState.CONNECTED ) {
           createOPCGroup(tagNames);
       }
   }
} );
autoReconnectController.connect ();