Initial commit
This commit is contained in:
62
lib/jsmodbus/handler/client/ReadDiscreteInputs.js
Normal file
62
lib/jsmodbus/handler/client/ReadDiscreteInputs.js
Normal file
@@ -0,0 +1,62 @@
|
||||
'use strict';
|
||||
|
||||
const Stampit = require('stampit');
|
||||
const Put = require('put');
|
||||
|
||||
|
||||
module.exports = Stampit()
|
||||
.init(function () {
|
||||
const FC = 2;
|
||||
|
||||
let init = () => this.addResponseHandler(FC, onResponse);
|
||||
|
||||
let onResponse = (unitId, pdu, cb) => {
|
||||
let fc = pdu.readUInt8(0);
|
||||
|
||||
if (fc !== FC) {
|
||||
cb(`ReadDiscreteInputs: Invalid FC ${fc}`);
|
||||
} else {
|
||||
let byteCount = pdu.readUInt8(1);
|
||||
let counter = 0;
|
||||
let resp = {
|
||||
unitId,
|
||||
fc: fc,
|
||||
byteCount: byteCount,
|
||||
payload: pdu.slice(2),
|
||||
data: []
|
||||
};
|
||||
|
||||
for (let i = 0; i < byteCount; i++) {
|
||||
let h = 1, cur = pdu.readUInt8(2 + i);
|
||||
for (let j = 0; j < 8; j+=1) {
|
||||
resp.data[counter] = (cur & h) > 0 ;
|
||||
h = h << 1;
|
||||
counter += 1;
|
||||
}
|
||||
}
|
||||
|
||||
cb && cb(null, resp);
|
||||
}
|
||||
};
|
||||
|
||||
this.readDiscreteInputs = (unitId, start, quantity) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (quantity > 2000) {
|
||||
return reject('quantity is too big');
|
||||
}
|
||||
|
||||
let pdu = Put().word8be(FC).word16be(start).word16be(quantity).buffer();
|
||||
|
||||
this.queueRequest(unitId, FC, pdu, (err, resp) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(resp);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
init();
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user