Hi Vlad, just a last advise, I have tried once to open more than one connection to a Siemens 1200 PLC with a multithread application and I got a problem of disconnection similat to your. In my code the disconnection was systematic when the second thread try to enstablish a connection.
My suggestion is to ensure that your code use just a single connection to the PLC, in this way you should reach a more stable solution. Regards, S. On 17/09/2020 13:01, Vladyslav Milutin wrote: > Hi Christofer, > > I can't access this machine where I got this exception, that's the problem, > I just got logs from the machine. > > Kind regards, > Vlad > > чт, 17 сент. 2020 г. в 13:38, Christofer Dutz <christofer.d...@c-ware.de>: > >> Hi Vlad, >> >> Your code says TCP ... so it should work, if you use WireShark on the >> machine that is >> trying to connect to the remote you won't even need the promiscuous mode. >> >> >> Chris >> >> >> Am 17.09.20, 12:26 schrieb "Vladyslav Milutin" <v.milu...@aegas.io>: >> >> Hi Christofer, >> >> Thanks for your advice, I'm not sure that I can use wireshark in my >> case :( >> Thanks for your answers, I'll try to create a watchdog for it and look >> for >> the connection statuses. >> >> Kind regards, >> Vlad >> >> чт, 17 сент. 2020 г. в 13:02, Christofer Dutz < >> christofer.d...@c-ware.de>: >> >> > Hi Vlad, >> > >> > I didn't miss the email, but for me it's almost impossible to give >> you an >> > advice to what might be going wrong. >> > The error you are getting I usually got in the past as soon as I >> send out >> > something the PLC doesn't like. >> > Just recently when we didn't reset the message-id counters and they >> > overflowed, some PLCs just hung up. >> > >> > So what I would do, would be to use WireShark to check what's >> actually >> > going over the wire and to check if this is ok. >> > If it's not, well you know what to fix. >> > >> > Chris >> > >> > >> > Am 17.09.20, 11:56 schrieb "Vladyslav Milutin" <v.milu...@aegas.io>: >> > >> > Hi guys, >> > >> > I just will resend this message in case you missed it. >> > >> > Hi guys, >> > >> > I can send you this code, which doesn't have much business >> logic, and >> > all >> > params are renamed. >> > >> > public abstract class LalelDriver<T extends Message> extends >> > GeneratedDriverBase<T> { >> > >> > private final ChannelHandler handler; >> > >> > @Override >> > public String getProtocolName() { >> > return "Lalel"; >> > } >> > >> > @Override >> > protected Class<? extends Configuration> >> getConfigurationType() { >> > return LalelConfiguration.class; >> > } >> > >> > @Override >> > protected String getDefaultTransport() { >> > return "tcp"; >> > } >> > >> > @Override >> > protected boolean canSubscribe() { >> > return true; >> > } >> > >> > @Override >> > protected LalelFieldHandler getFieldHandler() { >> > return new LalelFieldHandler(); >> > } >> > >> > @Override >> > protected void initializePipeline(ChannelFactory >> channelFactory) { >> > try { >> > final Channel channel = >> > channelFactory.createChannel(this.handler); >> > >> channelFactory.initializePipeline(channel.pipeline()); >> > >> > } catch (PlcConnectionException e) { >> > log.error("Failed to create channel"); >> > } >> > } >> > } >> > >> > public classLalelDriverTcp extends LalelDriver<EthernetMessage> { >> > >> > public LalelDriverTcp(final ChannelHandler handler){ >> > super(handler); >> > } >> > >> > @Override >> > public String getProtocolCode() { >> > return "lalel-tcp"; >> > } >> > >> > @Override >> > protected ProtocolStackConfigurer<EthernetMessage> >> > getStackConfigurer() >> > { >> > return DriverUtils.buildStackConfigurer( >> > EthernetMessage.class, EthernetMessageIO.class, >> > LalelProtocolLogicTcp.class, >> ByteLengthEstimator.class >> > ); >> > } >> > >> > /** >> > * Estimate the Length of a Packet >> > */ >> > public static class ByteLengthEstimator implements >> > ToIntFunction<ByteBuf> { >> > @Override >> > public int applyAsInt(ByteBuf byteBuf) { >> > if (byteBuf.readableBytes() >= 2) { >> > return >> > byteBuf.getUnsignedShortLE(byteBuf.readerIndex()); >> > } >> > return -1; >> > } >> > } >> > >> > } >> > >> > And connection code: >> > >> > this.connection = driver.getConnection(connectionString); >> > >> > this.connection.connect(); >> > >> > >> > Kind regards, >> > Vlad >> > >> > >> > Kind regards, >> > Vlad >> > >> > чт, 17 сент. 2020 г. в 12:09, Christofer Dutz < >> > christofer.d...@c-ware.de>: >> > >> > > Hi Vlad, >> > > >> > > 0.8.0-SNAPSHOT is the current development version ... >> > > we'll be releasing that as soon as we tied up some things we're >> > currently >> > > working on. >> > > >> > > Chris >> > > >> > > >> > > >> > > Am 17.09.20, 11:02 schrieb "Vladyslav Milutin" < >> v.milu...@aegas.io>: >> > > >> > > Hi Stefano, >> > > >> > > I'm curious about the 0.8.0 version, where I can find it? >> Since >> > maven >> > > repo >> > > contains the latest version 0.7.0. >> > > >> > > Kind regards, >> > > Vlad >> > > >> > > ср, 16 сент. 2020 г. в 17:30, Stefano Bossi < >> > stefano.bo...@gmail.com>: >> > > >> > > > Hi Vlad, >> > > > >> > > > this seems similar to a bug fixed some time ago, I am not >> > really >> > > sure but >> > > > it worth to try to use the 0.8.0 version where this fix >> is >> > present. >> > > > >> > > > You should try to build the version and here you could >> fine >> > some >> > > help: >> > > > https://plc4x.apache.org/developers/index.html >> > > > >> > > > Regards, >> > > > Stefano >> > > > >> > > > On 16/09/2020 14:32, Vladyslav Milutin wrote: >> > > > >> > > > Hello guys, >> > > > >> > > > I'm writing to you with a hope that you can help me with >> > exception >> > > > handling. >> > > > Currently after a long time connection can be reset by >> peer. >> > See >> > > stacktrace >> > > > below. >> > > > >> > > > I've tried to add a custom ChannelHandler which Overrides >> > > exceptionCaught() >> > > > and add it in Driver#initializePipeline() see code >> below. Also >> > has >> > > tried to >> > > > add a channel that can be obtained from >> > DefaultNettyPlcConnection. >> > > And none >> > > > of them actualy was added to the pipeline where this >> exception >> > was >> > > thrown. >> > > > >> > > > plc4x version: 0.7.0 >> > > > >> > > > StatckTrace: >> > > > 2020-09-16 13:50:03.340 WARN [nioEventLoopGroup-58-1] >> > > > [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: Connection reset by peer >> > > > at java.base/sun.nio.ch >> .FileDispatcherImpl.read0(Native >> > Method) >> > > > at java.base/sun.nio.ch >> > > .SocketDispatcher.read(SocketDispatcher.java:39) >> > > > at >> > > >> java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276) >> > > > at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:233) >> > > > at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223) >> > > > at java.base/sun.nio.ch >> > > .SocketChannelImpl.read(SocketChannelImpl.java:358) >> > > > at >> > io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253) >> > > > at >> > > >> io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133) >> > > > at >> > > > >> > > >> > >> io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) >> > > > at >> > > > >> > > >> > >> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148) >> > > > at >> > > > >> > > >> > >> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) >> > > > at >> > > > >> > > >> > >> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) >> > > > at >> > > > >> > > >> > >> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) >> > > > at >> > io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) >> > > > at >> > > > >> > > >> > >> io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) >> > > > at >> > > > >> > > >> > >> io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) >> > > > at >> > > > >> > > >> > >> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) >> > > > at java.base/java.lang.Thread.run(Thread.java:834) >> > > > >> > > > Driver#initializePipeline: >> > > > try { >> > > > final Channel channel = >> > > > channelFactory.createChannel(this.handler); >> > > > >> > channelFactory.initializePipeline(channel.pipeline()); >> > > > >> > > > } catch (PlcConnectionException e) { >> > > > log.error("Failed to create channel"); >> > > > } >> > > > >> > > > ChannelHandler: >> > > > @Override >> > > > public void exceptionCaught(ChannelHandlerContext >> ctx, >> > Throwable >> > > cause) >> > > > { >> > > > log.warn("ExceptionCaught in worker: ctx = [{}], >> cause >> > = >> > > [{}, {}], >> > > > workerName = [{}]", >> > > > ctx, cause.getClass(), >> cause.getMessage(), >> > > workerName); >> > > > if (cause instanceof ConnectTimeoutException) { >> > > > log.warn("ConnectionTimeout caught: >> workerName = >> > [{}]", >> > > > workerName); >> > > > } >> > > > if ((cause instanceof IOException) && >> > > > cause.getMessage().contains("Connection reset by peer")) >> { >> > > > log.warn("Connection reset by peer caught: >> > workerName = >> > > [{}]", >> > > > workerName); >> > > > } else { >> > > > log.info("Unexpected exception caught: >> workerName >> > = >> > > [{}]", >> > > > workerName); >> > > > } >> > > > >> > > > this.callback.accept(cause); >> > > > } >> > > > >> > > > DefaultNettyPlcConnection#channel:log.info("Trying to >> get >> > > connection channel: worker name = [{}]", >> > > > this.workerName); >> > > > final Channel channel = >> ((DefaultNettyPlcConnection) >> > > > this.connection).getChannel(); >> > > > log.info("Channel obtained successfully. Adding >> custom >> > > > channelHandler to it: channel = [{}], workerName = [{}]", >> > channel, >> > > > this.workerName); >> > > > channel.pipeline().addLast(this.channelHandler); >> > > > log.info("ChannelHandler added: channel = [{}], >> > > channelHandler = >> > > > [{}], workerName = [{}]", channel, this.channelHandler, >> > > this.workerName); >> > > > >> > > > Kind regards, >> > > > Vlad >> > > > >> > > > >> > > > >> > > > >> > > >> > > >> > >> > >> >>
signature.asc
Description: OpenPGP digital signature