UNPKG

@zandor300/jsmodbus

Version:

Implementation for the Serial/TCP Modbus protocol.

126 lines (125 loc) 4.39 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.isWriteMultipleCoilsRequestBody = isWriteMultipleCoilsRequestBody; const codes_1 = require("../codes"); const request_body_js_1 = __importDefault(require("./request-body.js")); class WriteMultipleCoilsRequestBody extends request_body_js_1.default { get address() { return this._address; } get values() { return this._values; } get valuesAsArray() { return this._valuesAsArray; } get valuesAsBuffer() { return this._valuesAsBuffer; } get quantity() { return this._quantity; } get count() { return this.quantity; } get byteCount() { return this._byteCount; } get numberOfBytes() { return this._numberOfBytes; } get name() { return 'WriteMultipleCoils'; } static fromBuffer(buffer) { try { const fc = buffer.readUInt8(0); if (fc !== codes_1.FC.WRITE_MULTIPLE_COILS) { return null; } const address = buffer.readUInt16BE(1); const quantity = buffer.readUInt16BE(3); const numberOfBytes = buffer.readUInt8(5); const values = buffer.slice(6, 6 + numberOfBytes); return new WriteMultipleCoilsRequestBody(address, values, quantity); } catch (e) { return null; } } constructor(address, values, quantity) { super(codes_1.FC.WRITE_MULTIPLE_COILS); if (address > 0xFFFF) { throw new Error('InvalidStartAddress'); } if (Array.isArray(values) && values.length > 0x07b0 * 8) { throw new Error('InvalidArraySize'); } if (values instanceof Buffer) { if (values.length > 0x07b0) { throw new Error('InvalidBufferSize'); } if (quantity !== undefined && (values.length * 8) < quantity) { throw new Error('InvalidBufferSize'); } } this._address = address; this._values = values; this._quantity = quantity || values.length; this._numberOfBytes = Math.ceil(this._quantity / 8); if (this._values instanceof Buffer) { this._valuesAsBuffer = this._values; this._byteCount = Math.ceil(this._quantity / 8) + 6; this._valuesAsArray = []; for (let i = 0; i < this._quantity; i += 1) { const pos = i % 8; const curByteIdx = Math.floor(i / 8); const curByte = this._values.readUInt8(curByteIdx); this._valuesAsArray.push((curByte & Math.pow(2, pos)) > 0); } } else if (this._values instanceof Array) { this._byteCount = Math.ceil(this._values.length / 8) + 6; this._valuesAsArray = this._values; const len = Math.min(1968, this._values.length); let curByte = 0; let curByteIdx = 0; let cntr = 0; const bytes = Buffer.allocUnsafe(this._numberOfBytes); for (let i = 0; i < len; i += 1) { curByte += this._values[i] ? Math.pow(2, cntr) : 0; cntr = (cntr + 1) % 8; if (cntr === 0 || i === len - 1) { bytes.writeUInt8(curByte, curByteIdx); curByteIdx = curByteIdx + 1; curByte = 0; } } this._valuesAsBuffer = bytes; } else { throw new Error('InvalidType_MustBeBufferOrArray'); } } createPayload() { const payload = Buffer.alloc(this._byteCount); payload.writeUInt8(this._fc, 0); payload.writeUInt16BE(this._address, 1); payload.writeUInt16BE(this._quantity, 3); payload.writeUInt8(this._numberOfBytes, 5); this._valuesAsBuffer.copy(payload, 6, 0, this._byteCount); return payload; } } exports.default = WriteMultipleCoilsRequestBody; function isWriteMultipleCoilsRequestBody(x) { if (x instanceof WriteMultipleCoilsRequestBody) { return true; } else { return false; } }