Hi,
after getting these results on reading fom the PLC, I tried writing. After some
test I managed to send a write request but here's what I am getting as error:
java.util.concurrent.ExecutionException:
java.lang.ArrayIndexOutOfBoundsException: arraycopy: last source index 1 out of
bounds for byte[0]
at
java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
~[?:?]
at
java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999) ~[?:?]
at org.apache.plc4x.camel.Plc4XProducer.process(Plc4XProducer.java:68)
~[?:?]
at org.apache.plc4x.camel.Plc4XProducer.process(Plc4XProducer.java:86)
~[?:?]
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)
~[!/:2.24.2]
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
[!/:2.24.2]
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
[!/:2.24.2]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
[!/:2.24.2]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
[!/:2.24.2]
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
[!/:2.24.2]
at
org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:197)
[!/:2.24.2]
at
org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:79)
[!/:2.24.2]
at java.util.TimerThread.mainLoop(Timer.java:556) [?:?]
at java.util.TimerThread.run(Timer.java:506) [?:?]
Caused by: java.lang.ArrayIndexOutOfBoundsException: arraycopy: last source
index 1 out of bounds for byte[0]
at java.lang.System.arraycopy(Native Method) ~[?:?]
at
org.apache.plc4x.java.s7.netty.strategies.DefaultS7MessageProcessor.processNonBooleanWriteVarParameter(DefaultS7MessageProcessor.java:309)
~[?:?]
at
org.apache.plc4x.java.s7.netty.strategies.DefaultS7MessageProcessor.processWriteVarParameter(DefaultS7MessageProcessor.java:226)
~[?:?]
at
org.apache.plc4x.java.s7.netty.strategies.DefaultS7MessageProcessor.processRequest(DefaultS7MessageProcessor.java:98)
~[?:?]
at org.apache.plc4x.java.s7.netty.S7Protocol.write(S7Protocol.java:178)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:716)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:708)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:791)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:701)
~[?:?]
at
io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:112)
~[?:?]
at
io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:716)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:708)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext.access$1700(AbstractChannelHandlerContext.java:56)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:1102)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1149)
~[?:?]
at
io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1073)
~[?:?]
at
io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
~[?:?]
at
io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:416)
~[?:?]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:515) ~[?:?]
at
io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918)
~[?:?]
at
io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[?:?]
at
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
~[?:?]
at java.lang.Thread.run(Thread.java:834) ~[?:?]
Any ideas on that?
Here is the route I built:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
default-activation="lazy">
<camelContext id="S7-PLC-Context"
xmlns="http://camel.apache.org/schema/blueprint" streamCache="true" >
<route>
<from uri="timer://foo?fixedRate=true&period=5000" />
<setHeader headerName="fieldName">
<constant>default</constant>
</setHeader>
<setHeader headerName="fieldQuery">
<constant>%DB1:4.0:STRING</constant>
</setHeader>
<setBody >
<simple>Hello</simple>
</setBody>
<log message=" Sending to PLC: ${body} at ${date:now:HH:mm:ss}"
loggingLevel="INFO" />
<to uri="plc4x:s7://192.168.178.10/0/1" />
</route>
</camelContext>
</blueprint>
Etienne
On 2020/02/20 07:50:39, Julian Feinauer <[email protected]> wrote:
> Thank you Etienne, I will try to reproduce the issue and have a look.
> But dont know when I will find the time as I'm currently travelling : /
>
> Julian
>
> Am 19.02.20, 14:06 schrieb "Etienne Robinet" <[email protected]>:
>
> Hi,
> I started the Jira issue: https://issues.apache.org/jira/browse/PLC4X-177
> Using this XML:
>
> <route>
> <from uri="timer://foo?fixedRate=true&period=1000"/>
> <pollEnrich>
>
> <constant>plc4x:s7://192.168.178.10/0/1?address=%MW102:INT</constant>
> </pollEnrich>
> <log message=" Sending ${body}" loggingLevel="INFO" />
> <to uri="mock:test?retainLast=10" />
>
>
>
> </route>
>
> it creates a PollingConsumer and reads every 1s. The problem is after
> every read, I get this warning
>
> 14:01:12.850 WARN [nioEventLoopGroup-2523-1] 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: An existing connection was forcibly closed by the
> remote host
> at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:?]
> at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
> ~[?:?]
> at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276) ~[?:?]
> at sun.nio.ch.IOUtil.read(IOUtil.java:233) ~[?:?]
> at sun.nio.ch.IOUtil.read(IOUtil.java:223) ~[?:?]
> at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:358)
> ~[?:?]
> at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:247)
> ~[!/:4.1.39.Final]
> at
> io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1140)
> ~[!/:4.1.39.Final]
> at
> io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347)
> ~[!/:4.1.39.Final]
> at
> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
> [!/:4.1.39.Final]
> at
> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:697)
> [!/:4.1.39.Final]
> at
> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632)
> [!/:4.1.39.Final]
> at
> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549)
> [!/:4.1.39.Final]
> at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511)
> [!/:4.1.39.Final]
> at
> io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918)
> [!/:4.1.39.Final]
> at
> io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
> [!/:4.1.39.Final]
> at
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
> [!/:4.1.39.Final]
> at java.lang.Thread.run(Thread.java:834) [?:?]
>
> Seems like the connection is closed then opened again every time? Here
> you can see that I manage to get the data tho: https://i.imgur.com/K6TTwxA.png
>
> Etienne
> On 2020/02/19 12:20:40, Julian Feinauer <[email protected]>
> wrote:
> > Hi Etienne,
> >
> > thanks fort he update.
> > I think the Camel integration was never really used, so it could be a
> bit unhandy, so to say : )
> > Probably you create an Issue in Jira
> https://issues.apache.org/jira/projects/PLC4X/issues where we track all
> activites and can help you with improvements.
> >
> > Best
> > Julian
> >
> > Am 19.02.20, 12:50 schrieb "Etienne Robinet" <[email protected]>:
> >
> > Hi all,
> > quick update, it worked on Camel inside Karaf with Julian's code. I
> managed to read from output, memento and datablock wit hthe correct adress
> input:
> >
> > <from
> uri="plc4x:s7://192.168.178.10/0/1?address=%25DB1:4.0:STRING"/>
> > -"%25" gets encoded as "%" in XML
> > -I fetch in the DB1 at byte 4 starting at his bit 0 and the data I
> want is a STRING.
> > -To read a memento, this also worked: address+%25MW102:INT
> >
> > Now I am going to investigate the polling consumer, as I want to
> fetch the data from the PLC at a polling interval.
> >
> > Etienne
> > On 2020/02/18 16:49:31, Etienne Robinet <[email protected]> wrote:
> > > I managed to get the tool working. By that I mean I got to to a
> read on my PLC, but seems like the connection is crashing afterwards.
> > > 17:46:56.556 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Instantiating new PLC Driver Manager with class loader
> jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
> > > 17:46:56.563 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Registering available drivers...
> > > 17:46:56.579 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Registering driver for Protocol s7 (Siemens S7 (Basic))
> > > 17:46:56.588 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Registering driver for Protocol ab-eth (Allen Bradley ETH)
> > > 17:46:56.628 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Registering driver for Protocol ads (Beckhoff Twincat ADS)
> > > 17:46:56.638 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Registering driver for Protocol eip (EtherNet/IP (TCP))
> > > 17:46:56.655 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Registering driver for Protocol modbus (Modbus (TCP / Serial))
> > > 17:46:56.723 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Registering driver for Protocol opcua (OPC UA (TCP))
> > > 17:46:56.736 [main] INFO o.apache.plc4x.java.PlcDriverManager -
> Registering driver for Protocol test (PLC4X Test Protocol)
> > > 17:46:57.059 [main] INFO o.a.p.j.s.connection.S7PlcConnection -
> Setting up S7 Connection with: host-name 192.168.178.10, rack 0, slot 1,
> pdu-size 1024, max-amq-caller 8, max-amq-callee 8
> > > 17:46:58.758 [nioEventLoopGroup-2-1] INFO
> o.a.plc4x.java.s7.netty.S7Protocol - S7Connection established pdu-size 960,
> max-amq-caller 3, max-amq-callee 3
> > > 17:46:58.776 [nioEventLoopGroup-2-1] INFO
> o.a.plc4x.java.s7.netty.S7Protocol - Successfully connected to S7: S7_1500
> wit PDU 960
> > > 17:46:58.800 [main] INFO o.a.p.j.e.helloplc4x.HelloPlc4x -
> Synchronous request ...
> > > 17:46:58.836 [main] INFO o.a.p.j.e.helloplc4x.HelloPlc4x -
> Value[value-0]: true
> > > 17:46:58.836 [main] INFO o.a.p.j.e.helloplc4x.HelloPlc4x -
> Asynchronous request ...
> > > 17:46:58.838 [nioEventLoopGroup-2-1] INFO
> o.a.p.j.e.helloplc4x.HelloPlc4x - Value[value-0]: true
> > > 17:46:58.844 [nioEventLoopGroup-2-1] WARN
> i.n.channel.DefaultChannelPipeline - 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: An existing connection was forcibly closed
> by the remote host
> > > at java.base/sun.nio.ch.SocketDispatcher.read0(Native Method)
> > > at
> java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
> > > 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:247)
> > > at
> io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1140)
> > > at
> io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347)
> > > at
> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
> > > at
> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:697)
> > > at
> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632)
> > > at
> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549)
> > > at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511)
> > > at
> io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918)
> > > 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)
> > > Disconnected from the target VM, address: '127.0.0.1:61672',
> transport: 'socket'
> > >
> > > Process finished with exit code 0
> > >
> > > This did the trick: I had o also enable PUT/GET on my PLC (via
> TIA Portal).
> > > Etienne
> > > On 2020/02/18 14:08:11, Etienne Robinet <[email protected]>
> wrote:
> > > > Hi, I tried the HelloPLC4X Tool, but it seems like he gets
> stuck. I'm still not sure about the arguments I am passing, here's the log
> > > >
> > > > 15:05:42.838 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Instantiating new PLC Driver Manager with class loader
> jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
> > > > 15:05:42.874 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Registering available drivers...
> > > > 15:05:42.892 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Registering driver for Protocol s7 (Siemens S7 (Basic))
> > > > 15:05:42.899 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Registering driver for Protocol ab-eth (Allen Bradley ETH)
> > > > 15:05:42.933 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Registering driver for Protocol ads (Beckhoff Twincat ADS)
> > > > 15:05:42.941 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Registering driver for Protocol eip (EtherNet/IP (TCP))
> > > > 15:05:42.956 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Registering driver for Protocol modbus (Modbus (TCP / Serial))
> > > > 15:05:42.980 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Registering driver for Protocol opcua (OPC UA (TCP))
> > > > 15:05:43.018 [main] INFO o.apache.plc4x.java.PlcDriverManager
> - Registering driver for Protocol test (PLC4X Test Protocol)
> > > > 15:05:43.553 [main] INFO o.a.p.j.s.connection.S7PlcConnection
> - Setting up S7 Connection with: host-name 192.168.178.10, rack 0, slot 1,
> pdu-size 1024, max-amq-caller 8, max-amq-callee 8
> > > > 15:05:45.281 [nioEventLoopGroup-2-1] INFO
> o.a.plc4x.java.s7.netty.S7Protocol - S7Connection established pdu-size 960,
> max-amq-caller 3, max-amq-callee 3
> > > > 15:05:45.299 [nioEventLoopGroup-2-1] INFO
> o.a.plc4x.java.s7.netty.S7Protocol - Successfully connected to S7: S7_1500
> wit PDU 960
> > > > 15:05:45.321 [main] INFO o.a.p.j.e.helloplc4x.HelloPlc4x -
> Synchronous request ... <-----STUCKED
> > > >
> > > >
> > > > And here are the arguments I am passing:
> > > > --connection-string s7://192.168.178.10/0/1 --field-addresses
> %DB2:1.0:INT[1]
> > > >
> > > > I also subscribed to the list ;-)
> > > >
> > > > On 2020/02/18 13:28:24, Julian Feinauer
> <[email protected]> wrote:
> > > > > Hi Etienne,
> > > > >
> > > > > first, you should try to just access it with the HelloPlc4X
> Tool, just to check that everything works.
> > > > > And Second, please subscribe to the mailing list, otherwise
> all your mails have to go through moderation : )
> > > > >
> > > > > Julian
> > > > >
> > > > > Am 18.02.20, 14:22 schrieb "Etienne Robinet"
> <[email protected]>:
> > > > >
> > > > > Hi Julian, thanks for the fast reply!
> > > > >
> > > > > The route seems to be started, but I try to put the body
> in log (to check) but with no sucess. Here is what I get with your code
> > > > >
> > > > > https://i.imgur.com/biB9ZpW.png
> > > > >
> > > > > After checking the code a bit, I tried to adapt my route.
> I am trying to access a DB (number 2) on my PLC which has a String(Hello) and
> an Int(5). I then try to show the body of the component on the log to verify.
> Maybe my syntax of uri is again not correct?
> > > > >
> > > > > <from
> uri="plc4x:s7://192.168.178.10/0/1?address=%25DB2:2.0:STRING[1]&dataType=java.lang.String"/>
> > > > > <log message=" Sending ${body}"
> loggingLevel="INFO" />
> > > > > <to uri="mock:test?retainLast=10" />
> > > > >
> > > > > On 2020/02/18 12:28:53, Julian Feinauer
> <[email protected]> wrote:
> > > > > > Hi Etienne,
> > > > > >
> > > > > > fort he sake of easiness... could you do a short test
> if it works, when you Replace the Content of PLC4XConsumer.java with the
> following:
> > > > > >
> > > > > > ```
> > > > > > /*
> > > > > > Licensed to the Apache Software Foundation (ASF) under
> one
> > > > > > or more contributor license agreements. See the
> NOTICE file
> > > > > > distributed with this work for additional information
> > > > > > regarding copyright ownership. The ASF licenses this
> file
> > > > > > to you under the Apache License, Version 2.0 (the
> > > > > > "License"); you may not use this file except in
> compliance
> > > > > > with the License. You may obtain a copy of the
> License at
> > > > > >
> > > > > > http://www.apache.org/licenses/LICENSE-2.0
> > > > > >
> > > > > > Unless required by applicable law or agreed to in
> writing,
> > > > > > software distributed under the License is distributed
> on an
> > > > > > "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> > > > > > KIND, either express or implied. See the License for
> the
> > > > > > specific language governing permissions and limitations
> > > > > > under the License.
> > > > > > */
> > > > > > package org.apache.plc4x.camel;
> > > > > >
> > > > > > import org.apache.camel.*;
> > > > > > import org.apache.camel.spi.ExceptionHandler;
> > > > > > import org.apache.camel.support.LoggingExceptionHandler;
> > > > > > import org.apache.camel.support.ServiceSupport;
> > > > > > import
> org.apache.camel.util.AsyncProcessorConverterHelper;
> > > > > > import org.apache.plc4x.java.api.PlcConnection;
> > > > > > import
> org.apache.plc4x.java.api.exceptions.PlcException;
> > > > > > import
> org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
> > > > > > import
> org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
> > > > > > import
> org.apache.plc4x.java.api.messages.PlcUnsubscriptionResponse;
> > > > > > import org.slf4j.Logger;
> > > > > > import org.slf4j.LoggerFactory;
> > > > > >
> > > > > > import java.util.Collection;
> > > > > > import java.util.concurrent.*;
> > > > > >
> > > > > > public class Plc4XConsumer extends ServiceSupport
> implements Consumer {
> > > > > > private static final Logger LOGGER =
> LoggerFactory.getLogger(Plc4XConsumer.class);
> > > > > >
> > > > > > private Plc4XEndpoint endpoint;
> > > > > > private AsyncProcessor processor;
> > > > > > private ExceptionHandler exceptionHandler;
> > > > > > private PlcConnection plcConnection;
> > > > > > private String fieldQuery;
> > > > > > private Class<?> dataType;
> > > > > > private PlcSubscriptionResponse
> subscriptionResponse;
> > > > > >
> > > > > > private ScheduledExecutorService executorService =
> Executors.newSingleThreadScheduledExecutor();
> > > > > > private ScheduledFuture<?> future;
> > > > > >
> > > > > > public Plc4XConsumer(Plc4XEndpoint endpoint,
> Processor processor) throws PlcException {
> > > > > > this.endpoint = endpoint;
> > > > > > this.dataType = endpoint.getDataType();
> > > > > > this.processor =
> AsyncProcessorConverterHelper.convert(processor);
> > > > > > this.exceptionHandler = new
> LoggingExceptionHandler(endpoint.getCamelContext(), getClass());
> > > > > > String plc4xURI =
> endpoint.getEndpointUri().replaceFirst("plc4x:/?/?", "");
> > > > > > this.plcConnection =
> endpoint.getPlcDriverManager().getConnection(plc4xURI);
> > > > > > this.fieldQuery = endpoint.getAddress();
> > > > > > }
> > > > > >
> > > > > > @Override
> > > > > > public String toString() {
> > > > > > return "Plc4XConsumer[" + endpoint + "]";
> > > > > > }
> > > > > >
> > > > > > @Override
> > > > > > public Endpoint getEndpoint() {
> > > > > > return endpoint;
> > > > > > }
> > > > > >
> > > > > > public ExceptionHandler getExceptionHandler() {
> > > > > > return exceptionHandler;
> > > > > > }
> > > > > >
> > > > > > public void setExceptionHandler(ExceptionHandler
> exceptionHandler) {
> > > > > > this.exceptionHandler = exceptionHandler;
> > > > > > }
> > > > > >
> > > > > > @Override
> > > > > > protected void doStart() throws
> InterruptedException, ExecutionException {
> > > > > > // TODO: Is it correct to only support one
> field?
> > > > > > future = executorService.schedule(() -> {
> > > > > > plcConnection.readRequestBuilder()
> > > > > > .addItem("default", fieldQuery)
> > > > > > .build()
> > > > > > .execute()
> > > > > > .thenAccept(response -> {
> > > > > > LOGGER.debug("Received {}",
> response);
> > > > > > try {
> > > > > > Exchange exchange =
> endpoint.createExchange();
> > > > > >
> exchange.getIn().setBody(unwrapIfSingle(response.getAllObjects("default")));
> > > > > > processor.process(exchange);
> > > > > > } catch (Exception e) {
> > > > > >
> exceptionHandler.handleException(e);
> > > > > > }
> > > > > > });
> > > > > > }, 3, TimeUnit.SECONDS);
> > > > > > }
> > > > > >
> > > > > > @Override
> > > > > > protected void doStop() throws
> InterruptedException, ExecutionException, TimeoutException {
> > > > > > // First stop the polling process
> > > > > > if (future != null) {
> > > > > > future.cancel(true);
> > > > > > }
> > > > > > // TODO: Handle the response ...
> > > > > > try {
> > > > > > plcConnection.close();
> > > > > > } catch (Exception e) {
> > > > > > LOGGER.error("Error closing connection", e);
> > > > > > }
> > > > > > }
> > > > > >
> > > > > > private Object unwrapIfSingle(Collection
> collection) {
> > > > > > if (collection.isEmpty()) {
> > > > > > return null;
> > > > > > }
> > > > > > if (collection.size() == 1) {
> > > > > > return collection.iterator().next();
> > > > > > }
> > > > > > return collection;
> > > > > > }
> > > > > >
> > > > > > }
> > > > > > ```
> > > > > >
> > > > > > Julian
> > > > > >
> > > > > >
> > > > > > Am 18.02.20, 13:22 schrieb "Julian Feinauer"
> <[email protected]>:
> > > > > >
> > > > > > Hi Etienne,
> > > > > >
> > > > > > oh, sorry, indeed. The Code in the Camel module is
> right, but does not work for Siemens S7.
> > > > > > Let me try to write you an updated version in
> another branch ASAP then you can check it.
> > > > > >
> > > > > > Sorry!
> > > > > > Julian
> > > > > >
> > > > > > Am 18.02.20, 12:56 schrieb "Etienne Robinet"
> <[email protected]>:
> > > > > >
> > > > > > I just cloned the rel/0.6 branch from git,
> until now I didn't change anything.
> > > > > > Regards,,
> > > > > > Etienne
> > > > > >
> > > > > > On 2020/02/18 11:10:39, Julian Feinauer
> <[email protected]> wrote:
> > > > > > > Did you post your code somewhere? I cant find
> it.. just post it somewhere and I will have a look!
> > > > > > >
> > > > > > > Julian
> > > > > > >
> > > > > > > Am 18.02.20, 11:28 schrieb "Etienne Robinet"
> <[email protected]>:
> > > > > > >
> > > > > > > Hi Julian,
> > > > > > > thanks for the advice, but where should I
> change the code to apply your modification? Is it in the doStart() methode of
> de PLC4XConsumer?
> > > > > > > Regards,
> > > > > > >
> > > > > > > Etienne
> > > > > > >
> > > > > > > On 2020/02/18 08:55:22, Julian Feinauer
> <[email protected]> wrote:
> > > > > > > > Hi Etienne,
> > > > > > > >
> > > > > > > > thank you for your investigation.
> > > > > > > > I just locked at your log and it seems
> that connection works fine and some messages are exchanged BUT you try to
> subscribe to a Value which is currently not supported.
> > > > > > > > Try to just use the
> "readRequestBuilder().addItem("", "").build().execute().get()" approach to
> send a single request, that should work.
> > > > > > > >
> > > > > > > > Best
> > > > > > > > Julian
> > > > > > > >
> > > > > > > > Am 18.02.20, 09:39 schrieb "Etienne
> Robinet" <[email protected]>:
> > > > > > > >
> > > > > > > > Hello,
> > > > > > > > with the help of some colleague we
> managed to find how to fix the issue so that the DriverManager can find the
> actual s7 protocol.
> > > > > > > > All I had to do is to create a
> maven project (karaf-blueprint) archetype and do as follow:
> > > > > > > >
> > > > > > > > 1. Inside the pom, add the
> S7PlcDriver under "imports"
> > > > > > > > 2. create a service under
> main/java/resources/META-INF/services/xxx.xxx.PlcDriver containing the
> implementation (S7PlcDriver) and license
> > > > > > > > 3. Create a simple XML blueprint
> (with a real address this time connected to a real PLC)
> > > > > > > > <blueprint
> xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
> > > > > > > >
> > > > > > > > <camelContext id="PLC-Context"
> xmlns="http://camel.apache.org/schema/blueprint" streamCache="true">
> > > > > > > >
> > > > > > > >
> > > > > > > > <route id="Route1">
> > > > > > > >
> > > > > > > > <from
> uri="plc4x:s7://192.168.178.10/1/1"/>
> > > > > > > > <log message=" Sending
> ${body}" loggingLevel="INFO" />
> > > > > > > > <to
> uri="mock:test?retainLast=10" />
> > > > > > > >
> > > > > > > > </route>
> > > > > > > >
> > > > > > > > </camelContext>
> > > > > > > >
> > > > > > > > </blueprint>
> > > > > > > >
> > > > > > > > So now I have the next issue, I can
> see from the log that a connection is established but it tells me that the
> connection doesn't support connection. Am I missing a parameter or what could
> be the issue?
> > > > > > > >
> > > > > > > > Here the log:
> > > > > > > >
> > > > > > > > https://i.imgur.com/KgWz8DF.png
> > > > > > > >
> > > > > > > > On 2020/02/17 12:11:56, Christofer
> Dutz <[email protected]> wrote:
> > > > > > > > > Hi all,
> > > > > > > > >
> > > > > > > > > having a more detailed look at
> the log-trace, it seems the DriverManager isn't able to find the S7 driver at
> all ...
> > > > > > > > > But I guess if it even was
> available, as Cesar pointed out, the field address is that of the mock driver
> and not of the S7 so this will not work.
> > > > > > > > > Also are you connecting to
> localhost, which is also probably not what you want. Unless you are running a
> S7 simulator on your machine.
> > > > > > > > >
> > > > > > > > > Depending of if you're using a
> released version of the s7 driver the connection URL is correct, however if
> you switch to the new S7 driver it would look like this: s7://{ip or host}
> > > > > > > > > Not the "/1/1" are now missing.
> > > > > > > > >
> > > > > > > > > Chris
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > Am 17.02.20, 13:04 schrieb "Cesar
> Garcia" <[email protected]>:
> > > > > > > > >
> > > > > > > > > Hi,
> > > > > > > > >
> > > > > > > > > The PLC address does not look
> correct, can you confirm that it really
> > > > > > > > > points to a real PLC or an S7
> simulator?
> > > > > > > > >
> > > > > > > > > <from
> uri="plc4x:s7:localhost/1/1"/>
> > > > > > > > >
> > > > > > > > > Best regards,
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > El vie., 14 feb. 2020 a las
> 18:34, Etienne Robinet (<[email protected]>)
> > > > > > > > > escribió:
> > > > > > > > >
> > > > > > > > > > Hello everyone,
> > > > > > > > > > I've spent some days trying
> to figure out how to make PLC4X work inside a
> > > > > > > > > > karaf container in
> combination with camel blueprints for routing.
> > > > > > > > > > I've downloaded the latest
> release (0.5.0) and built it with maven. I then
> > > > > > > > > > installed the
> driver-s7-feature and plc4j-apache-camel bundle into my
> > > > > > > > > > container and got following
> bundles running:
> > > > > > > > > >
> > > > > > > > > > >PLC4J: API
> > > > > > > > > > >PLC4J: Driver: S7
> > > > > > > > > > >PLC4J: Protocol:
> Driver-Base: Base
> > > > > > > > > > >PLC4J: Protocol:
> Driver-Base: TCP
> > > > > > > > > > >PLC4J: Protocol: ISO on TCP
> > > > > > > > > > >PLC4J: Protocol: ISO TP
> > > > > > > > > > >PLC4J: Protocol: S7
> > > > > > > > > > >PLC4j: Utils: Driver Base:
> Java
> > > > > > > > > > >PLC4J: Integrations:
> Apache Camel
> > > > > > > > > >
> > > > > > > > > > After trying a simple route
> with this consumer component:
> > > > > > > > > > <from
> uri="plc4x:s7:localhost/1/1"/> (the address is for testing purpose)
> > > > > > > > > > I get the following error:
> > > > > > > > > > Error occurred during
> starting CamelContext: PLC-Context
> > > > > > > > > >
> org.apache.camel.FailedToCreateRouteException: Failed to create route
> > > > > > > > > > Route1:
> Route(Route1)[[From[plc4x:s7:localhost/1/1]] -> [To[mock:tes...
> > > > > > > > > > because of Unable to find
> driver for protocol 's7'
> > > > > > > > > >
> > > > > > > > > > I've tested numerous
> version of PLC4X and got the same results, so I think
> > > > > > > > > > I might be close to fix it!
> > > > > > > > > > Any help would be
> appreciated!
> > > > > > > > > >
> > > > > > > > > > Here the full log
> > > > > > > > > >
> > > > > > > > > > 16:30:45.578 INFO
> [Blueprint Event Dispatcher: 1] Attempting to start
> > > > > > > > > > CamelContext: PLC-Context
> > > > > > > > > > 16:30:45.579 INFO
> [Blueprint Event Dispatcher: 1] Apache Camel 2.24.2
> > > > > > > > > > (CamelContext: PLC-Context)
> is starting
> > > > > > > > > > 16:30:45.580 INFO
> [Blueprint Event Dispatcher: 1] StreamCaching is enabled
> > > > > > > > > > on CamelContext: PLC-Context
> > > > > > > > > > 16:30:45.580 INFO
> [Blueprint Event Dispatcher: 1] JMX is enabled
> > > > > > > > > > 16:30:45.600 INFO
> [Blueprint Event Dispatcher: 1] Instantiating new PLC
> > > > > > > > > > Driver Manager with class
> loader
> > > > > > > > > >
> BundleDelegatingClassLoader(plc4j-route.xml [67])
> > > > > > > > > > 16:30:45.600 INFO
> [Blueprint Event Dispatcher: 1] Registering available
> > > > > > > > > > drivers...
> > > > > > > > > > 16:30:45.601 TRACE
> [Blueprint Event Dispatcher: 1] FindResource:
> > > > > > > > > >
> META-INF/services/org.apache.plc4x.java.spi.PlcDriver
> > > > > > > > > > 16:30:45.627 INFO
> [Blueprint Event Dispatcher: 1] StreamCaching in use
> > > > > > > > > > with spool directory:
> > > > > > > > > >
> C:\karaf\bin\..\data\tmp\camel\camel-tmp-00f849ac-0ccf-4b12-822d-dda62267eb6c
> > > > > > > > > > and rules: [Spool > 128K
> body size]
> > > > > > > > > > 16:30:45.629 INFO
> [Blueprint Event Dispatcher: 1] Apache Camel 2.24.2
> > > > > > > > > > (CamelContext: PLC-Context)
> is shutting down
> > > > > > > > > > 16:30:45.639 INFO
> [Blueprint Event Dispatcher: 1] Apache Camel 2.24.2
> > > > > > > > > > (CamelContext: PLC-Context)
> uptime 0.060 seconds
> > > > > > > > > > 16:30:45.640 INFO
> [Blueprint Event Dispatcher: 1] Apache Camel 2.24.2
> > > > > > > > > > (CamelContext: PLC-Context)
> is shutdown in 0.011 seconds
> > > > > > > > > > 16:30:45.640 WARN
> [Blueprint Event Dispatcher: 1] Changing Camel state for
> > > > > > > > > > bundle 67 to Failure
> > > > > > > > > > 16:30:45.641 ERROR
> [Blueprint Event Dispatcher: 1] Error occurred during
> > > > > > > > > > starting CamelContext:
> PLC-Context
> > > > > > > > > >
> org.apache.camel.FailedToCreateRouteException: Failed to create route
> > > > > > > > > > Route1:
> Route(Route1)[[From[plc4x:s7:localhost/1/1]] -> [To[mock:tes...
> > > > > > > > > > because of Unable to find
> driver for protocol 's7'
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.RouteService.warmUp(RouteService.java:147)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3954)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3861)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3647)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3488)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3247)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3243)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3266)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3243)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3159)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.blueprint.BlueprintCamelContext.start(BlueprintCamelContext.java:255)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.blueprint.BlueprintCamelContext.maybeStart(BlueprintCamelContext.java:297)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.blueprint.BlueprintCamelContext.blueprintEvent(BlueprintCamelContext.java:188)
> > > > > > > > > > [!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.aries.blueprint.container.BlueprintEventDispatcher$3.call(BlueprintEventDispatcher.java:190)
> > > > > > > > > > [!/:1.10.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.aries.blueprint.container.BlueprintEventDispatcher$3.call(BlueprintEventDispatcher.java:188)
> > > > > > > > > > [!/:1.10.2]
> > > > > > > > > > at
> java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
> > > > > > > > > > at
> > > > > > > > > >
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
> > > > > > > > > > [?:?]
> > > > > > > > > > at
> java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
> > > > > > > > > > at
> > > > > > > > > >
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
> > > > > > > > > > [?:?]
> > > > > > > > > > at
> java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
> > > > > > > > > > at
> > > > > > > > > >
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
> > > > > > > > > > [?:?]
> > > > > > > > > > at
> > > > > > > > > >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
> > > > > > > > > > [?:?]
> > > > > > > > > > at
> > > > > > > > > >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
> > > > > > > > > > [?:?]
> > > > > > > > > > at
> java.lang.Thread.run(Thread.java:834) [?:?]
> > > > > > > > > > Caused by:
> org.apache.plc4x.java.api.exceptions.PlcConnectionException:
> > > > > > > > > > Unable to find driver for
> protocol 's7'
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.plc4x.java.PlcDriverManager.getDriver(PlcDriverManager.java:98)
> > > > > > > > > > ~[?:?]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.plc4x.java.PlcDriverManager.getConnection(PlcDriverManager.java:71)
> > > > > > > > > > ~[?:?]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.plc4x.camel.Plc4XConsumer.<init>(Plc4XConsumer.java:57) ~[?:?]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.plc4x.camel.Plc4XEndpoint.createConsumer(Plc4XEndpoint.java:72)
> > > > > > > > > > ~[?:?]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.EventDrivenConsumerRoute.addServices(EventDrivenConsumerRoute.java:69)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.DefaultRoute.onStartingServices(DefaultRoute.java:107)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.RouteService.doWarmUp(RouteService.java:172)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > at
> > > > > > > > > >
> org.apache.camel.impl.RouteService.warmUp(RouteService.java:145)
> > > > > > > > > > ~[!/:2.24.2]
> > > > > > > > > > ... 24 more
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > > --
> > > > > > > > > *CEOS Automatización, C.A.*
> > > > > > > > > *GALPON SERVICIO INDUSTRIALES
> Y NAVALES FA, C.A.,*
> > > > > > > > > *PISO 1, OFICINA 2, AV. RAUL
> LEONI, SECTOR GUAMACHITO,*
> > > > > > > > >
> > > > > > > > > *FRENTE A LA ASOCIACION DE
> GANADEROS,BARCELONA,EDO. ANZOATEGUI*
> > > > > > > > > *Ing. César García*
> > > > > > > > > *Cel: 0416-681.03.99*
> > > > > > > > >
> > > > > > > > > *Cel: 0414-760.98.95*
> > > > > > > > >
> > > > > > > > > *Hotline Técnica SIEMENS:
> 0800 1005080*
> > > > > > > > >
> > > > > > > > > *Email:
> [email protected]
> > > > > > > > >
> <[email protected]>*
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > >
> >
> >
> >
>
>
>