whole_func_string: function TypedReadReplyParserArray(data) {
    const info = TypedReadParserInfo(data);
    const values = [];
  
    let offset = info.Length;
    let readFunction = null;
  
    switch (info.dataTypeID) {
      case 3:
        readFunction = function (data, offset) {
          return String.fromCharCode(data[offset]);
        };
        break;
      case 4:
        readFunction = function (data, offset) {
          return data.readInt16LE(offset); // return data.readUInt16LE(offset);
        };
        break;
      case 8:
        readFunction = function (data, offset) {
          return data.readFloatLE(offset);
        };
        break;
      default:
        console.log(`PCCC Error: Unknown Type: ${info.dataTypeID}`);
    }
  
    if (readFunction) {
      const lastOffset = data.length - info.dataSize;
  
      while (offset <= lastOffset) {
        values.push(readFunction(data, offset));
        offset += info.dataSize;
      }
    }
  
    return values;
  }
func_code_string: function TypedReadReplyParserArray(data) {
    const info = TypedReadParserInfo(data);
    const values = [];
  
    let offset = info.Length;
    let readFunction = null;
  
    switch (info.dataTypeID) {
      case 3:
        readFunction = function (data, offset) {
          return String.fromCharCode(data[offset]);
        };
        break;
      case 4:
        readFunction = function (data, offset) {
          return data.readInt16LE(offset); // return data.readUInt16LE(offset);
        };
        break;
      case 8:
        readFunction = function (data, offset) {
          return data.readFloatLE(offset);
        };
        break;
      default:
        console.log(`PCCC Error: Unknown Type: ${info.dataTypeID}`);
    }
  
    if (readFunction) {
      const lastOffset = data.length - info.dataSize;
  
      while (offset <= lastOffset) {
        values.push(readFunction(data, offset));
        offset += info.dataSize;
      }
    }
  
    return values;
  }
func_documentation_string: const PCCCServiceCodes = { 0x4B: 'Exec PCCC Service', 0x4C: 'DH+ Like Service', 0x4D: 'Local PCCC Service' }; /*
  Source: http://iatip.blogspot.com/2008/11/ethernetip-pccc-service-codes.html
  To force a DF1 message with destination=5 and source=2
  0x4c                                              - DH+ Like Service
  0x02 0x20 0x67 0x24 0x01                          - IOI to PCCC object
  0x00 0x00 0x02 0x00 0x00 0x00 0x05 0x00           - DH+ Like Header
  0x0F 0x00 0x5C 0x00 0xA2 0x14 0x07 0x89 0x00 0x00 - example pccc message
  
  The originator info has been swapped with an 8 byte struct of the form
  AA AA BB XX CC CC DD XX.
  "XX" are control bytes of some sort, just leave 0x00
  "AA AA" is the destination link
  "BB" is the destination node
  "CC CC" is the source link
  "DD" is the source node