[
https://issues.apache.org/jira/browse/PLC4X-341?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17542004#comment-17542004
]
Andy Grebe commented on PLC4X-341:
----------------------------------
Hi Chris,
Yes, I'll be putting in a pull request today/tomorrow with what I have
atm. I just got the format for the STRING struct for the write yesterday.
I was looking at the PlcSTRUCT/LIST, but the user defined structs only have
the type ID of STRUCTURED with struct type ID for the type of struct
followed by a byte array of the struct(at least what I've seen from the
AB). If it's setup by the end user, each struct would have to be parsed by
them, not the plc4x driver. I'll take another look to see if there is a
way to request the data to be better formatted, since it does seem odd that
it's not sent in something more...I don't know... structured? :)
Example of what I'm seeing:
0A20 - Structured
3AE2 - Structured type
0100 - INT
0200 - INT
Thanks,
Andy
On Wed, May 25, 2022 at 5:03 AM Christofer Dutz (Jira) <[email protected]>
> PLC4J GIP/CIP Read STRING tag returns null w/error
> --------------------------------------------------
>
> Key: PLC4X-341
> URL: https://issues.apache.org/jira/browse/PLC4X-341
> Project: Apache PLC4X
> Issue Type: Bug
> Components: Driver-Ethernet/IP, PLC4J
> Affects Versions: 0.9.1
> Reporter: Andy Grebe
> Priority: Major
> Attachments: eipcipstringread.pcapng, eipcipstringwrite1.pcapng
>
>
> 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
> {code:java}
> %MyString[{index}]:STRING:1 {code}
> 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:
> {code:java}
> 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();
> } {code}
>
--
This message was sent by Atlassian Jira
(v8.20.7#820007)