Files
yunkong2.modbus/lib/jsmodbus/handler/client/WriteMultipleRegisters.js
2018-09-15 01:04:38 +08:00

115 lines
3.4 KiB
JavaScript

'use strict';
const Stampit = require('stampit');
const Put = require('put');
module.exports = Stampit()
.init(function () {
const FC = 16;
let init = () => this.addResponseHandler(FC, onResponse);
let onResponse = (unitId, pdu, cb) => {
const fc = pdu.readUInt8(0);
if (fc !== FC) {
cb(`WriteMultipleRegisters: Invalid FC ${fc}`);
} else {
const startAddress = pdu.readUInt16BE(1);
const quantity = pdu.readUInt16BE(3);
let resp = {
unitId: unitId,
fc: fc,
startAddress: startAddress,
quantity: quantity
};
cb(null, resp);
}
};
this.writeMultipleRegisters = (unitId, startAddress, data) => {
return new Promise((resolve, reject) => {
let pdu = Put().word8(FC).word16be(startAddress);
if (data instanceof Buffer) {
if (data.length / 2 > 0x007b) {
reject('Length is too big');
return;
}
pdu.word16be(register.length / 2).word8(data.length).put(data);
} else if (data instanceof Array) {
if (data.length > 0x007b) {
reject('Length is too big');
return;
}
let byteCount = Math.ceil(data.length * 2);
pdu.word16be(data.length).word8(byteCount);
for (let i = 0; i < data.length; i += 1) {
pdu.word16be(data[i]);
}
} else {
reject('Invalid data');
return;
}
this.queueRequest(unitId, FC, pdu.buffer(), (err, resp) => {
if (err) {
reject(err);
} else {
resolve(resp);
}
});
});
};
this.writeMultipleRegisters = function (startAddress, register) {
var defer = Q.defer();
var fc = 16,
pdu = Put()
.word8(fc)
.word16be(startAddress);
if(register instanceof Buffer) {
if(register.length/2 > 0x007b) {
defer.reject();
}
pdu.word16be(register.length/2)
.word8(register.length)
.put(register)
}
else if(register instanceof Array) {
if (register.length > 0x007b) {
defer.reject();
return;
}
var byteCount = Math.ceil(register.length * 2),
curByte = 0;
pdu.word16be(register.length)
.word8(byteCount);
for (var i = 0; i < register.length; i += 1) {
pdu.word16be(register[i]);
}
} else {
defer.reject();
}
pdu = pdu.buffer();
this.queueRequest(fc, pdu, defer);
return defer.promise;
};
init();
});