plc4x-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Julian Feinauer <j.feina...@pragmaticminds.de>
Subject Re: Reconnect of driver 2
Date Fri, 29 Mar 2019 10:02:13 GMT
Hey Gunter,

one more notice.
I just submitted the PR with your ping method, which seems to work pretty well for S7 and
Modbus-tcp as we checked.

If you want to use the pool, which basically works like a JDBC Connection pool, you can use
something like this snippet:

```
private static PooledPlcDriverManager createPooledDriverManager() {
        return new PooledPlcDriverManager(pooledPlcConnectionFactory -> {
            GenericKeyedObjectPoolConfig<PlcConnection> poolConfig = new GenericKeyedObjectPoolConfig<>();
            poolConfig.setMinIdlePerKey(1);  // This should avoid problems with long running
connect attempts??
            poolConfig.setTestOnBorrow(true);
            poolConfig.setTestOnReturn(true);
            return new GenericKeyedObjectPool<>(pooledPlcConnectionFactory, poolConfig);
        });
    }
```
(Taken from org.apache.plc4x.java.scraper.ScraperImpl).

The pool keeps a set of connections and hands them over if someone needs them. Before handing
over and after getting them back, the pool verifies that the connection is still alive (TestOnBorrw,
TestOnReturn) and in case it is not, the Connection is removed from the pool (and a new one
is created when requested).
This should be a more elegant solution to your loop.
Especially as the pool would create more concurrent connections, if multiple requests are
made concurrently.

Best
Julian

´╗┐Am 29.03.19, 09:59 schrieb "Gunther Gruber" <gunther.gruber@IDA-Analytics.de>:

    Hi Julian,
    
    i am not sure about this. according to documentation this has to be 
    enabled explicitly. 
    https://support.industry.siemens.com/cs/document/87149213/how-do-you-define-the-true-constant-in-the-lad-fdb-editor-in-step-7-(tia-portal)-?dti=0&lc=en-AT.
    
    Gunther
    
    
    On 29.03.19 09:17, Julian Feinauer wrote:
    > Hi Gunter,
    >
    > I am currently looking through your code and wanted to prepare a commit, so just
a question about the s7 implementation.
    > Is the M1.2 a generally available bit or is this something more specific to your
use cases?
    > I know that the M are the Markers and generally all Boolean, but can there be a situation
where this bit does not exist?
    >
    > Julian
    >
    > Am 28.03.19, 15:16 schrieb "Gunther Gruber" <gunther.gruber@IDA-Analytics.de>:
    >
    >      Hi Julian,
    >      
    >      somhow my github account got flagged.
    >      
    >      I append the two functions below, i think it will take some time for github
to respond on the mail i wrote.
    >      
    >      
    >      public boolean ping(String host, int port, int timeout) {
    >        Socket s = null;
    >        try {
    >          s = new Socket();
    >          s.connect(new InetSocketAddress(host, port), timeout);
    >          return true;
    >        } catch (Exception e) {
    >          return false;
    >        } finally {
    >          if (s != null) {
    >            try {
    >              s.close();
    >            } catch (Exception e) {
    >            }
    >          }
    >        }
    >      }
    >      
    >      private boolean channelPingCheck(int timeout) {
    >              String variable = "%M1.2:BOOL";
    >              return channelPingCheck(timeout, variable);
    >          }
    >      
    >          private boolean channelPingCheck(int timeout, String variable) {
    >      
    >      //      String variable = "%M1.2:BOOL";
    >      
    >      //      boolean expectedResult = true;
    >      
    >              try {
    >                  plcConnection = getPlcConnection();
    >              } catch (PlcConnectionException e) {
    >                  return false;
    >              }
    >      
    >              PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
    >      
    >              builder.addItem(variable, variable);
    >      
    >              PlcReadRequest readRequest = builder.build();
    >      
    >              PlcReadResponse result = null;
    >              try {
    >                  result = readRequest.execute().get(timeout, TimeUnit.MILLISECONDS);
    >              } catch (InterruptedException e) {
    >                  Thread.currentThread().interrupt();
    >              } catch (ExecutionException | TimeoutException e) {
    >                  return false;
    >              }
    >      
    >              if (result == null) {
    >                  return false;
    >              }
    >      
    >              Object content;
    >              content = result.getObject(variable);
    >              if (content == null) {
    >                  return false;
    >              }
    >              //we could compare against the real value of the object here, but then
we need to be more specific about the variable type
    >              return true;
    >      
    >          }
    >   
    

Mime
View raw message