Uploaded image for project: 'Apache PLC4X'
  1. Apache PLC4X
  2. PLC4X-341

PLC4J GIP/CIP Read STRING tag returns null w/error

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 0.9.1
    • None
    • Driver-Ethernet/IP, PLC4J
    • 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();    
      } 

       

      Attachments

        1. eipcipstringwrite1.pcapng
          16 kB
          Andy Grebe
        2. eipcipstringread.pcapng
          2.42 MB
          Andy Grebe

        Activity

          People

            Unassigned Unassigned
            AndyGPLC Andy Grebe
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated: