I am trying to run HiveMQ Edge with an S7 adaptor but I can’t get the connector to work. I am running HiveMQ Edge Version: 2025.4-rc in a docker container. I have tried both exposing ports (including 102) and a macvlan network neither seem to be able to connect to the PLC. See logs below:
2025-03-06 07:34:10,879 INFO - Registering driver for Protocol s7 (Siemens S7 (Basic))
2025-03-06 07:34:10,891 INFO - Starting protocol-adapter 'GK_PLC1'.
2025-03-06 07:34:11,061 INFO - Configuring Bootstrap with Configuration{local-rack=1, local-slot=1, local-tsap=0, remote-rack=0, remote-slot=1, remote-rack2=0, remote-slot2=0, remote-tsap=0, pduSize=1024, maxAmqCaller=8, maxAmqCallee=8, controllerType=S7_1500, readTimeOut=8, ping=false, pingTime=-1, retryTime=4}
2025-03-06 07:34:11,144 INFO - S7 Driver running in ACTIVE mode.
2025-03-06 07:34:11,308 INFO - 07:34:11.308013849 userEventTriggered: S7HMuxImpl#0 Event: org.apache.plc4x.java.spi.events.ConnectEvent@2688fb9a
2025-03-06 07:34:11,312 INFO - java.util.NoSuchElementException: watchdog
2025-03-06 07:34:11,409 INFO - 07:34:11.408956495 userEventTriggered: S7HMuxImpl#0 Event: org.apache.plc4x.java.spi.events.ConnectedEvent@3891e54e
2025-03-06 07:34:11,444 INFO - Protocol-adapter 'GK_PLC1' started successfully.
2025-03-06 07:34:22,426 WARN - During the polling for adapter with id 'GK_PLC1' an exception occurred:
java.util.concurrent.TimeoutException: null
at java.base/java.util.concurrent.CompletableFuture$Timeout.run(Unknown Source)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
2025-03-06 07:34:22,438 WARN - Polling for protocol adapter 'GK_PLC1' can not keep up with the specified '1000' interval, because the polling takes too long.
I have tried increasing the poll interval to 5000 ms - same results.
I noticed that the adapter is using a local rack and local slot configuration and I think that might be causing the issue but I can’t seem to find the option to change it on the UI. Any advise?
OK a little update - I pulled the latest image and ran the container again this time I am getting some more logs related to the error. Maybe this will allow some one to help me. Really hoping this make sense to someone out there. Can I run the adapter without any PLC tags configured?
2025-03-13 16:37:30,573 INFO - Found configuration for adapter GKPLC1 / s7
2025-03-13 16:37:30,574 INFO - Starting protocol-adapter 'GKPLC1'.
2025-03-13 16:37:30,585 INFO - Configuring Bootstrap with Configuration{local-rack=1, local-slot=1, local-tsap=0, remote-rack=0, remote-slot=1, remote-rack2=0, remote-slot2=0, remote-tsap=0, pduSize=1024, maxAmqCaller=8, maxAmqCallee=8, controllerType=S7_1500, readTimeOut=8, ping=false, pingTime=-1, retryTime=4}
2025-03-13 16:37:31,591 INFO - Unable to connect, shutting down worker thread.
2025-03-13 16:37:31,591 INFO - org.apache.plc4x.java.api.exceptions.PlcConnectionException: Error creating channel.
2025-03-13 16:37:31,592 INFO - 16:37:31.592662091 userEventTriggered: S7HMuxImpl#0 Event: org.apache.plc4x.java.spi.events.DisconnectEvent@d3719c0
2025-03-13 16:37:31,593 INFO - DisconnectEvent
2025-03-13 16:37:31,594 INFO - Error encountered connecting to external device.
org.apache.plc4x.java.api.exceptions.PlcConnectionException: Connection is not possible.
at org.apache.plc4x.java.s7.readwrite.connection.S7HDefaultNettyPlcConnection.connect(S7HDefaultNettyPlcConnection.java:154)
at org.apache.plc4x.java.DefaultPlcDriverManager.getConnection(DefaultPlcDriverManager.java:80)
at com.hivemq.edge.adapters.plc4x.impl.Plc4xConnection.initConnection(Plc4xConnection.java:87)
at com.hivemq.edge.adapters.plc4x.impl.Plc4xConnection.<init>(Plc4xConnection.java:62)
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter$1.<init>(AbstractPlc4xAdapter.java:191)
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter.createConnection(AbstractPlc4xAdapter.java:188)
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter.initConnection(AbstractPlc4xAdapter.java:175)
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter.start(AbstractPlc4xAdapter.java:139)
at com.hivemq.protocols.ProtocolAdapterWrapper.start(ProtocolAdapterWrapper.java:97)
at com.hivemq.protocols.ProtocolAdapterManager.start(ProtocolAdapterManager.java:357)
at com.hivemq.protocols.ProtocolAdapterManager.updateAdapter(ProtocolAdapterManager.java:456)
at com.hivemq.protocols.ProtocolAdapterManager.lambda$updateAdapterConfig$14(ProtocolAdapterManager.java:473)
at java.base/java.util.Optional.map(Unknown Source)
at com.hivemq.protocols.ProtocolAdapterManager.updateAdapterConfig(ProtocolAdapterManager.java:465)
at com.hivemq.api.resources.impl.ProtocolAdaptersResourceImpl.updateAdapter(ProtocolAdaptersResourceImpl.java:355)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:256)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:235)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
at org.glassfish.jersey.jdkhttp.JdkHttpHandlerContainer.handle(JdkHttpHandlerContainer.java:135)
at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at jdk.httpserver/sun.net.httpserver.AuthFilter.doFilter(Unknown Source)
at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown Source)
at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
2025-03-13 16:37:31,596 WARN - Protocol-adapter 'GKPLC1' could not be started, reason: java.lang.RuntimeException: com.hivemq.edge.adapters.plc4x.Plc4xException: Error connecting
java.util.concurrent.CompletionException: java.lang.RuntimeException: com.hivemq.edge.adapters.plc4x.Plc4xException: Error connecting
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.thenCompose(Unknown Source)
at com.hivemq.protocols.ProtocolAdapterWrapper.start(ProtocolAdapterWrapper.java:100)
at com.hivemq.protocols.ProtocolAdapterManager.start(ProtocolAdapterManager.java:357)
at com.hivemq.protocols.ProtocolAdapterManager.updateAdapter(ProtocolAdapterManager.java:456)
at com.hivemq.protocols.ProtocolAdapterManager.lambda$updateAdapterConfig$14(ProtocolAdapterManager.java:473)
at java.base/java.util.Optional.map(Unknown Source)
at com.hivemq.protocols.ProtocolAdapterManager.updateAdapterConfig(ProtocolAdapterManager.java:465)
at com.hivemq.api.resources.impl.ProtocolAdaptersResourceImpl.updateAdapter(ProtocolAdaptersResourceImpl.java:355)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:256)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:235)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
at org.glassfish.jersey.jdkhttp.JdkHttpHandlerContainer.handle(JdkHttpHandlerContainer.java:135)
at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at jdk.httpserver/sun.net.httpserver.AuthFilter.doFilter(Unknown Source)
at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown Source)
at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: com.hivemq.edge.adapters.plc4x.Plc4xException: Error connecting
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter.initConnection(AbstractPlc4xAdapter.java:179)
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter.start(AbstractPlc4xAdapter.java:139)
at com.hivemq.protocols.ProtocolAdapterWrapper.start(ProtocolAdapterWrapper.java:97)
... 37 common frames omitted
Caused by: com.hivemq.edge.adapters.plc4x.Plc4xException: Error connecting
at com.hivemq.edge.adapters.plc4x.impl.Plc4xConnection.initConnection(Plc4xConnection.java:95)
at com.hivemq.edge.adapters.plc4x.impl.Plc4xConnection.<init>(Plc4xConnection.java:62)
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter$1.<init>(AbstractPlc4xAdapter.java:191)
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter.createConnection(AbstractPlc4xAdapter.java:188)
at com.hivemq.edge.adapters.plc4x.impl.AbstractPlc4xAdapter.initConnection(AbstractPlc4xAdapter.java:175)
... 39 common frames omitted
Caused by: org.apache.plc4x.java.api.exceptions.PlcConnectionException: Connection is not possible.
at org.apache.plc4x.java.s7.readwrite.connection.S7HDefaultNettyPlcConnection.connect(S7HDefaultNettyPlcConnection.java:154)
at org.apache.plc4x.java.DefaultPlcDriverManager.getConnection(DefaultPlcDriverManager.java:80)
at com.hivemq.edge.adapters.plc4x.impl.Plc4xConnection.initConnection(Plc4xConnection.java:87)
... 43 common frames omitted
Thank you for the reply. I do have PLC Tags configured (I didn’t when I orignally send the message) but I am still getting the same errors. Maybe I have done something daft in the config. Can you advise if something is not right in the config below: