src/Stack/Packets/PCCCPacket.js
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;
}
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;
}
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