HiveMQ EDGE S7 adapter encountered an error

Hi,

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

Hi @saad.ahmad

Welcome to the HiveMQ Community! You can’t run the adapter without any PLC tags configured, here is an example of a minimal S7 adapter configuration

Kind regards,
Diego from HiveMQ Team

Hi Diego,

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:

        <protocol-adapter>
            <adapterId>GKPLC1</adapterId>
            <protocolId>s7</protocolId>
            <configVersion>1</configVersion>
            <config>
                <port>102</port>
                <host>192.168.100.221</host>
                <controllerType>S7_1500</controllerType>
                <remoteRack>0</remoteRack>
                <remoteRack2>0</remoteRack2>
                <remoteSlot>1</remoteSlot>
                <remoteSlot2>0</remoteSlot2>
                <remoteTsap>0</remoteTsap>
                <s7ToMqtt>
                    <pollingIntervalMillis>1000</pollingIntervalMillis>
                    <maxPollingErrorsBeforeRemoval>10</maxPollingErrorsBeforeRemoval>
                    <publishChangedDataOnly>true</publishChangedDataOnly>
                </s7ToMqtt>
            </config>
            <tags>
                <tag>
                    <name>Agg_Damper01_OpCycles</name>
                    <description>operating cycles</description>
                    <definition>
                        <tagAddress>DB16.W0</tagAddress>
                        <dataType>DINT</dataType>
                    </definition>
                </tag>
            </tags>
            <southboundMappings/>
            <northboundMappings>
                <northboundMapping>
                    <topic>trueEdge</topic>
                    <tagName>Agg_Damper01_OpCycles</tagName>
                    <maxQos>1</maxQos>
                    <messageHandlingOptions>MQTTMessagePerTag</messageHandlingOptions>
                    <includeTagNames>true</includeTagNames>
                    <includeTimestamp>true</includeTimestamp>
                    <mqttUserProperties/>
                    <messageExpiryInterval>9007199254740991</messageExpiryInterval>
                </northboundMapping>
            </northboundMappings>
        </protocol-adapter>