jsmodbus
Version:
Implementation for the Serial/TCP Modbus protocol.
107 lines (86 loc) • 2.69 kB
JavaScript
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