UNPKG

jsmodbus

Version:

Implementation for the Serial/TCP Modbus protocol.

107 lines (86 loc) 2.64 kB
const ModbusResponseBody = require('./response-body.js') const { bufferToArrayStatus, arrayStatusToBuffer } = require('../buffer-utils.js') /** Read Discrete Inputs Response Body (Function Code 0x02) * @extends ModbusResponseBody * @class */ class ReadDiscreteInputsResponseBody extends ModbusResponseBody { /** Create ReadDiscreteInputsResponseBody from Request * @param {ReadDiscreteInputsRequestBody} request * @param {Buffer} discreteInputs * @returns ReadDiscreteInputsResponseBody */ static fromRequest (requestBody, discreteInputs) { const discreteStatus = bufferToArrayStatus(discreteInputs) const start = requestBody.start const end = start + requestBody.count // Extract the segment of coils status const segmentStatus = discreteStatus.slice(start, end) return new ReadDiscreteInputsResponseBody(segmentStatus, Math.ceil(segmentStatus.length / 8)) } /** Create ReadDiscreteInputsResponseBody from Buffer * @param {Buffer} buffer * @returns ReadDiscreteInputsResponseBody */ static fromBuffer (buffer) { try { const fc = buffer.readUInt8(0) const byteCount = buffer.readUInt8(1) const coilStatus = buffer.slice(2, 2 + byteCount) if (coilStatus.length !== byteCount) { return null } if (fc !== 0x02) { return null } return new ReadDiscreteInputsResponseBody(coilStatus, byteCount) } catch (e) { return null } } /** Creates a ReadDiscreteInputsResponseBody * @param {Array} discrete Array with Boolean values * @param {Number} length Quantity of Coils */ constructor (discrete, numberOfBytes) { super(0x02) this._discrete = discrete this._numberOfBytes = numberOfBytes if (discrete instanceof Array) { this._valuesAsArray = discrete this._valuesAsBuffer = arrayStatusToBuffer(discrete) } if (discrete instanceof Buffer) { this._valuesAsBuffer = discrete this._valuesAsArray = bufferToArrayStatus(discrete) } } /** Coils */ get discrete () { return this._discrete } get valuesAsArray () { return this._valuesAsArray } get valuesAsBuffer () { return this._valuesAsBuffer } /** Length */ get numberOfBytes () { return this._numberOfBytes } get byteCount () { return this._numberOfBytes + 2 } createPayload () { const payload = Buffer.alloc(this.byteCount) payload.writeUInt8(this._fc, 0) payload.writeUInt8(this._numberOfBytes, 1) this._valuesAsBuffer.copy(payload, 2) return payload } } module.exports = ReadDiscreteInputsResponseBody