plc4x
plc4x copied to clipboard
PLC4J GIP/CIP Read STRING tag returns null w/error
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();
}
Imported from Jira PLC4X-341. Original Jira may contain additional context. Reported by: AndyGPLC.
@hutcheb Can this issue be closed?
I have seen the driver read strings, so I'm closing this.