ethernet-ip
Version:
A feature-complete EtherNet/IP client for Rockwell ControlLogix/CompactLogix PLCs
51 lines • 1.75 kB
JavaScript
;
/**
* CIP Message Router — build requests and parse responses.
* Per CIP Vol 1, Chapter 2
*
* Request:
* [service(1), pathSize(1), path(N), data(M)]
*
* Response:
* [service|0x80(1), reserved(1), status(1), extStatusSize(1), extStatus(K), data(M)]
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.build = build;
exports.parse = parse;
/**
* Build a Message Router request.
*
* @param service - CIP service code
* @param path - Padded EPATH (from EPathBuilder)
* @param data - Service-specific request data
*/
function build(service, path, data = Buffer.alloc(0)) {
// Path size in 16-bit words
const pathWords = Math.ceil(path.length / 2);
const pathBytes = pathWords * 2;
const buf = Buffer.alloc(2 + pathBytes + data.length);
buf.writeUInt8(service, 0); // Service code
buf.writeUInt8(pathWords, 1); // Path size (words)
path.copy(buf, 2); // Padded EPATH
data.copy(buf, 2 + pathBytes); // Service data
return buf;
}
/**
* Parse a Message Router response.
*/
function parse(buf) {
const service = buf.readUInt8(0); // Reply service (request | 0x80)
// byte 1 reserved
const generalStatusCode = buf.readUInt8(2);
const extendedStatusLength = buf.readUInt8(3); // In 16-bit words
// Extended status: array of UINT16LE
const extendedStatus = [];
for (let i = 0; i < extendedStatusLength; i++) {
extendedStatus.push(buf.readUInt16LE(4 + i * 2));
}
// Data follows extended status
const dataOffset = 4 + extendedStatusLength * 2;
const data = buf.subarray(dataOffset);
return { service, generalStatusCode, extendedStatusLength, extendedStatus, data };
}
//# sourceMappingURL=message-router.js.map