Re: Connection died after disconnection

2020-07-21 Thread Christofer Dutz
Hi Stefano,

First of all, welcome on our list... We'll do our best to help you.

Have you tried using our connection pool? Cause this should handle the 
connection state if the connection is disturbed. Also the scraper is a tool for 
collecting data periodically. This in combination with the connection pool 
should be what you are looking for.

Please find the documentation to using both on our website.

Hope that helps,
Chris

Von: Stefano Bossi 
Gesendet: Dienstag, 21. Juli 2020 15:56
An: Apache PLC4X 
Betreff: Connection died after disconnection


Dear forum,

I am trying to develop a simple poller for my S7 PLC ST_1200.
I need just a simple thread in java which read a value and report it, anyway 
this must be robust to any problem on the network.
I mean I would like to cope with these situation:

  *   PLC not responding;
  *   network issues;

The software should normally read a value from the plc in 200 ms and if 
something bad happen, wait for 5 second and retry to read in a normal way.

I wrote some code but when I found a problem.
This is my code:

public void run() {
ConfigurationDataProvider configurationDataProvider = 
ConfigurationDataProvider.getInstance();
try {
PlcConnection plcConnection = new 
Client().getClient(configurationDataProvider.getPlcConnectionString()).getPlcConnection();
PlcReadRequest.Builder requestBuilder = 
plcConnection.readRequestBuilder();
requestBuilder.addItem("pollingVariable", 
configurationDataProvider.getPlcPollingVariable());
PlcReadRequest readRequest = requestBuilder.build();
while (true){
if (plcConnection.isConnected()){
try {
PlcReadResponse response = 
readRequest.execute().get(CONNECTION_TIME_OUT, TimeUnit.MILLISECONDS);
if (response != null ){
logger.debug("Polling variable: {}", 
response.getPlcValue("pollingVariable"));
} else {
logger.error("No response from PLC in reading 
polling variable");
break;
}
} catch (TimeoutException timeoutException){
logger.error("Time out Exception in polling PLC", 
timeoutException);
Thread.sleep(5000);
}

Thread.sleep(configurationDataProvider.getPollingInterval());
}
}

} catch (Exception e) {
logger.error("Interrupted Exception", e);
}
}


When I try to disconnect the cable, netty comply with an internal error and my 
application dies without a way to recover.
Here are the logs:

[ERROR] 15:33:38.830 it.fox.plcreader.Poller.run() - Time out Exception in 
polling PLC
java.util.concurrent.TimeoutException: null
at java.util.concurrent.CompletableFuture.timedGet(Unknown Source) ~[?:?]
at java.util.concurrent.CompletableFuture.get(Unknown Source) ~[?:?]
at it.fox.plcreader.Poller.run(Poller.java:34) [main/:?]
Poller.java:34
at java.lang.Thread.run(Unknown Source) [?:?]
[ERROR] 15:33:49.333 it.fox.plcreader.Poller.run() - Time out Exception in 
polling PLC
java.util.concurrent.TimeoutException: null
at java.util.concurrent.CompletableFuture.timedGet(Unknown Source) ~[?:?]
at java.util.concurrent.CompletableFuture.get(Unknown Source) ~[?:?]
at it.fox.plcreader.Poller.run(Poller.java:34) [main/:?]
Poller.java:34
at java.lang.Thread.run(Unknown Source) [?:?]
[WARN ] 15:33:54.308 
io.netty.channel.DefaultChannelPipeline.onUnhandledInboundException() - An 
exceptionCaught() event was fired, and it reached at the tail of the pipeline. 
It usually means the last handler in the pipeline did not handle the exception.
java.io.IOException: Operation timed out
at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:?]
at sun.nio.ch.SocketDispatcher.read(Unknown Source) ~[?:?]
at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) ~[?:?]
at sun.nio.ch.IOUtil.read(Unknown Source) ~[?:?]
at sun.nio.ch.IOUtil.read(Unknown Source) ~[?:?]
at sun.nio.ch.SocketChannelImpl.read(Unknown Source) ~[?:?]
at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253) 
~[netty-buffer-4.1.47.Final.jar:4.1.47.Final]
PooledByteBuf.java:253
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133) 
~[netty-buffer-4.1.47.Final.jar:4.1.47.Final]
AbstractByteBuf.java:1133
at 
io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
 ~[netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioSocketChannel.java:350
at 
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
 [netty-transport-4.1.47.Final.jar:4.1.47.Final]
AbstractNioByteChannel.java:148
at 

Connection died after disconnection

2020-07-21 Thread Stefano Bossi
Dear forum,

I am trying to develop a simple poller for my S7 PLC ST_1200.
I need just a simple thread in java which read a value and report it,
anyway this must be robust to any problem on the network.
I mean I would like to cope with these situation:

  * PLC not responding;
  * network issues;

The software should normally read a value from the plc in 200 ms and if
something bad happen, wait for 5 second and retry to read in a normal way.

I wrote some code but when I found a problem.
This is my code:

|public void run() { ConfigurationDataProvider configurationDataProvider
= ConfigurationDataProvider.getInstance(); try { PlcConnection
plcConnection = new
Client().getClient(configurationDataProvider.getPlcConnectionString()).getPlcConnection();
PlcReadRequest.Builder requestBuilder =
plcConnection.readRequestBuilder();
requestBuilder.addItem("pollingVariable",
configurationDataProvider.getPlcPollingVariable()); PlcReadRequest
readRequest = requestBuilder.build(); while (true){ if
(plcConnection.isConnected()){ try { PlcReadResponse response =
readRequest.execute().get(CONNECTION_TIME_OUT, TimeUnit.MILLISECONDS);
if (response != null ){ logger.debug("Polling variable: {}",
response.getPlcValue("pollingVariable")); } else { logger.error("No
response from PLC in reading polling variable"); break; } } catch
(TimeoutException timeoutException){ logger.error("Time out Exception in
polling PLC", timeoutException); Thread.sleep(5000); }
Thread.sleep(configurationDataProvider.getPollingInterval()); } } }
catch (Exception e) { logger.error("Interrupted Exception", e); } } |

When I try to disconnect the cable, netty comply with an internal error
and my application dies without a way to recover.
Here are the logs:

|[ERROR] 15:33:38.830 it.fox.plcreader.Poller.run() - Time out Exception
in polling PLC java.util.concurrent.TimeoutException: null at
java.util.concurrent.CompletableFuture.timedGet(Unknown Source) ~[?:?]
at java.util.concurrent.CompletableFuture.get(Unknown Source) ~[?:?] at
it.fox.plcreader.Poller.run(Poller.java:34) [main/:?] Poller.java:34 at
java.lang.Thread.run(Unknown Source) [?:?] [ERROR] 15:33:49.333
it.fox.plcreader.Poller.run() - Time out Exception in polling PLC
java.util.concurrent.TimeoutException: null at
java.util.concurrent.CompletableFuture.timedGet(Unknown Source) ~[?:?]
at java.util.concurrent.CompletableFuture.get(Unknown Source) ~[?:?] at
it.fox.plcreader.Poller.run(Poller.java:34) [main/:?] Poller.java:34 at
java.lang.Thread.run(Unknown Source) [?:?] [WARN ] 15:33:54.308
io.netty.channel.DefaultChannelPipeline.onUnhandledInboundException() -
An exceptionCaught() event was fired, and it reached at the tail of the
pipeline. It usually means the last handler in the pipeline did not
handle the exception. java.io.IOException: Operation timed out at
sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:?] at
sun.nio.ch.SocketDispatcher.read(Unknown Source) ~[?:?] at
sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) ~[?:?] at
sun.nio.ch.IOUtil.read(Unknown Source) ~[?:?] at
sun.nio.ch.IOUtil.read(Unknown Source) ~[?:?] at
sun.nio.ch.SocketChannelImpl.read(Unknown Source) ~[?:?] at
io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
~[netty-buffer-4.1.47.Final.jar:4.1.47.Final] PooledByteBuf.java:253 at
io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133)
~[netty-buffer-4.1.47.Final.jar:4.1.47.Final] AbstractByteBuf.java:1133
at
io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
~[netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioSocketChannel.java:350 at
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
[netty-transport-4.1.47.Final.jar:4.1.47.Final]
AbstractNioByteChannel.java:148 at
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
[netty-transport-4.1.47.Final.jar:4.1.47.Final] NioEventLoop.java:714 at
io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
[netty-transport-4.1.47.Final.jar:4.1.47.Final] NioEventLoop.java:650 at
io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
[netty-transport-4.1.47.Final.jar:4.1.47.Final] NioEventLoop.java:576 at
io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
[netty-transport-4.1.47.Final.jar:4.1.47.Final] NioEventLoop.java:493 at
io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
[netty-common-4.1.47.Final.jar:4.1.47.Final]
SingleThreadEventExecutor.java:989 at
io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
[netty-common-4.1.47.Final.jar:4.1.47.Final] ThreadExecutorMap.java:74
at
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
[netty-common-4.1.47.Final.jar:4.1.47.Final]
FastThreadLocalRunnable.java:30 at java.lang.Thread.run(Unknown Source)
[?:?] |

Googling I found this Stack Overflow