Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
0.9.1
-
None
-
None
Description
STRING tag reads in plc4j using eip are not returning the string. The error returned is:
java.lang.NullPointerException: Cannot invoke "org.apache.plc4x.java.api.value.PlcValue.getString()" because the return value of "org.apache.plc4x.java.api.messages.PlcReadResponse.getPlcValue(String)" is null
It looks like plc4j is considering it a structure or array. If I read with
%MyString[{index}]:STRING:1
I can get the individual characters in the string by placing the actual index in {index}. So it knows where to start reading the data from.
When running a wireshark cap, I can see the returned string in the response from the PLC. Attached is a pcap of the transaction.
Code Snippet:
try (PlcConnection plcConnection = new PlcDriverManager().getConnection("eip://127.0.0.1")) { if (!plcConnection.getMetadata().canRead()) { logger.error("PLC connection doesn't support reading."); return; } logger.info("PLC connector connected"); // Create a new read request: PlcReadRequest.Builder builder = plcConnection.readRequestBuilder(); logger.info("Created Builder"); builder.addItem("value-1", "%MyString:STRING:1"); PlcReadRequest readRequest = builder.build(); // Register a callback executed as soon as a response arrives. logger.info("Make sync request for PLC data"); PlcReadResponse readResponse = readRequest.execute().get(5000, TimeUnit.MILLISECONDS); if (readResponse != null) { printPlcResponse(readResponse); } else { logger.error("An error reading PLC, response is NULL"); } for (String field : readResponse.getFieldNames()){ rtnArray.add(new PlcReadResponseData(field, readResponse.getPlcValue(field).getString()) ); // Exception is thrown here } } catch (PlcConnectionException e) { e.printStackTrace(); }