UNPKG

jsmodbus

Version:

Implementation for the Serial/TCP Modbus protocol.

107 lines (86 loc) 2.69 kB
const ModbusResponseBody = require('./response-body.js') /** Read Input Registers Response Body (Function Code 0x04) * @extends ModbusResponseBody * @class */ class ReadInputRegistersResponseBody extends ModbusResponseBody { /** Create ReadInputRegistersResponseBody from Request * @param {ReadInputRegistersRequestBody} request * @param {Buffer} inputRegisters * @returns ReadInputRegistersResponseBody */ static fromRequest (requestBody, inputRegisters) { const startByte = requestBody.start * 2 const endByte = startByte + (requestBody.count * 2) const buf = inputRegisters.slice(startByte, endByte) return new ReadInputRegistersResponseBody(buf.length, buf) } /** Create ReadInputRegistersResponseBody from Buffer * @param {Buffer} buffer * @returns ReadInputRegistersResponseBody */ static fromBuffer (buffer) { const fc = buffer.readUInt8(0) const byteCount = buffer.readUInt8(1) const payload = buffer.slice(2, 2 + byteCount) if (fc !== 0x04) { return null } const values = [] for (let i = 0; i < byteCount; i += 2) { values.push(payload.readUInt16BE(i)) } return new ReadInputRegistersResponseBody(byteCount, values, payload) } constructor (byteCount, values, payload) { super(0x04) this._byteCount = byteCount this._values = values this._bufferLength = 2 if (values instanceof Array) { this._valuesAsArray = values this._bufferLength += values.length * 2 } if (values instanceof Buffer) { this._valuesAsBuffer = values this._bufferLength += values.length } if (payload !== undefined && payload instanceof Buffer) { this._valuesAsBuffer = payload } } get byteCount () { return this._bufferLength } get values () { return this._values } get valuesAsArray () { return this._valuesAsArray } get valuesAsBuffer () { return this._valuesAsBuffer } get length () { return this._values.length } createPayload () { if (this._values instanceof Buffer) { let payload = Buffer.alloc(2) payload.writeUInt8(this._fc, 0) payload.writeUInt8(this._byteCount, 1) payload = Buffer.concat([payload, this._values]) return payload } if (this._values instanceof Array) { const payload = Buffer.alloc(this._byteCount + 2) payload.writeUInt8(this._fc, 0) payload.writeUInt8(this._byteCount, 1) this._values.forEach(function (value, i) { payload.writeUInt16BE(Math.max(0, Math.min(0xFFFF, value)), 2 + 2 * i) }) return payload } } } module.exports = ReadInputRegistersResponseBody