You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@plc4x.apache.org by "Andy Grebe (Jira)" <ji...@apache.org> on 2022/05/06 12:55:00 UTC

[jira] [Updated] (PLC4X-341) PLC4J GIP/CIP Read STRING tag returns null w/error

     [ https://issues.apache.org/jira/browse/PLC4X-341?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Andy Grebe updated PLC4X-341:
-----------------------------
    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 
{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}
 

  was:
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}
 


> 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
>
>
> 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)