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
<https://stackoverflow.com/questions/40370114/netty-an-exceptioncaught-event-was-fired-and-it-reached-at-the-tail-of-the>
thread which seems to talk about this kind of error but is too far for
my java knowledge.

How could I let my code to never stop retrying ?

Thanks for your wonderful work.

Regards,
Stefano

​

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to