Hi Everyone, I am using a plc4x modbus driver to read data from a modbus device but i am left with an exception. But while reading data from the ModbusPal virtual device I am getting the output. The java code and the error message is given below.
I need help from this community to complete my POC. Java code. import org.apache.plc4x.java.PlcDriverManager; import org.apache.plc4x.java.api.PlcConnection; import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcReadResponse; import org.apache.plc4x.java.api.types.PlcResponseCode; import java.util.concurrent.CompletableFuture; public class modbus { public static void main(String[] args) throws Exception { System.out.println("started"); String connectionString = "modbus:tcp://192.168.4.163:4001?unit-identifier=2"; try { PlcConnection plcConnection = new PlcDriverManager().getConnection(connectionString); if (!plcConnection.getMetadata().canRead()) { System.out.println("This connection doesn't support reading."); return; } PlcReadRequest.Builder builder = plcConnection.readRequestBuilder(); builder.addItem("tag1","holding-register:101"); // builder.addItem("tag2","holding-register:1[3]"); PlcReadRequest readRequest = builder.build(); CompletableFuture<? extends PlcReadResponse> asyncResponse = readRequest.execute(); asyncResponse.whenComplete((response, throwable) -> { System.out.println("response :"+response.toString() ); for (String fieldName : response.getFieldNames()) { if (response.getResponseCode(fieldName) == PlcResponseCode.OK){ int registerValues = response.getNumberOfValues(fieldName); if (registerValues == 1){ System.out.println(fieldName +" : "+ response.getObject(fieldName)); } else { for (int i = 0; i< registerValues;i++){ System.out.println(fieldName + i +" : " + response.getObject(fieldName,i)); } } } else { System.out.println("Error[" + fieldName+ "]: "+ response.getResponseCode(fieldName).name()); } } }); } catch (Exception e) { System.out.println("Something went wrong."+e); } System.out.println("Execution completed"); } } Output: started SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Execution completed Aug 12, 2020 3:05:02 PM io.netty.channel.DefaultChannelPipeline onUnhandledInboundException WARNING: 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. io.netty.handler.codec.DecoderException: org.apache.plc4x.java.api.exceptions.PlcRuntimeException: Unexpected response type ModbusPDUReadHoldingRegistersResponse at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:98) at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295) at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:103) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) 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) Caused by: org.apache.plc4x.java.api.exceptions.PlcRuntimeException: Unexpected response type ModbusPDUReadHoldingRegistersResponse at org.apache.plc4x.java.modbus.protocol.ModbusProtocolLogic.toPlcValue(ModbusProtocolLogic.java:240) at org.apache.plc4x.java.modbus.protocol.ModbusProtocolLogic.lambda$read$2(ModbusProtocolLogic.java:112) at org.apache.plc4x.java.spi.Plc4xNettyWrapper.decode(Plc4xNettyWrapper.java:154) at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:88) ... 23 more When used another Modbus master Simulator by name - modpoll to cross verify , getting the correct value as shown below. ./modpoll -m tcp -a 2 -r 101 -c 1 -t 4:float -p 4001 192.168.4.163 modpoll 3.9 - FieldTalk(tm) Modbus(R) Master Simulator Copyright (c) 2002-2020 proconX Pty Ltd Visit https://www.modbusdriver.com for Modbus libraries and tools. Protocol configuration: MODBUS/TCP, FC3 Slave configuration...: address = 2, start reference = 101, count = 1 Communication.........: 192.168.4.163, port 4001, t/o 1.00 s, poll rate 1000 ms Data type.............: 32-bit float, output (holding) register table -- Polling slave... (Ctrl-C to stop) [101]: 2353.341064 -- Polling slave... (Ctrl-C to stop) Reply time-out! -- Polling slave... (Ctrl-C to stop) Reply time-out! -- Polling slave... (Ctrl-C to stop) [101]: 2353.341064 -- Polling slave... (Ctrl-C to stop) [101]: 2353.341064 -- Polling slave... (Ctrl-C to stop) [101]: 2353.341064 -- Thanks and Regards; Syed Kefayath -- IMPORTANT: The contents of this email and any attachments are confidential. They are intended for the named recipient(s) only. If you have received this email by mistake, please notify the sender immediately and do not disclose the contents to anyone or make copies thereof. Please, consider your environmental responsibility. Before printing this e-mail ask yourself: "Do I need a hard copy?"