forked from timofei-iatsenko/node-modbus-rtu
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpacket-utils.js
More file actions
76 lines (67 loc) · 1.69 KB
/
Copy pathpacket-utils.js
File metadata and controls
76 lines (67 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
var crc = require('crc');
var BufferPut = require('bufferput');
const DATA_TYPES = {
INT: 1,
UINT: 2,
ASCII: 3,
};
module.exports = {
DATA_TYPES: DATA_TYPES,
/**
* Slice header, bytes count and crc. Return buffer only with data
* @param {Buffer} buffer
*/
getDataBuffer: function(buffer) {
return buffer.slice(3, buffer.length - 2);
},
/**
* Parse function 03 response packet (read holding registers)
* @param {Buffer} buffer
* @param {number?} dataType
* @returns {number[]}
*/
parseFc03Packet: function(buffer, dataType) {
var results = [];
for (var i = 0; i < buffer.length; i += 2) {
results.push(readDataFromBuffer(buffer, i, dataType));
}
return results;
},
/**
* Returns new buffer signed with CRC
* @param {Buffer} buf
* @returns {Buffer}
*/
addCrc: function(buf) {
return (new BufferPut())
.put(buf)
.word16le(crc.crc16modbus(buf))
.buffer();
},
/**
*
* @param {Buffer} buffer
* @returns boolean
*/
checkCrc: function(buffer) {
var pdu = buffer.slice(0, buffer.length - 2);
return buffer.equals(this.addCrc(pdu));
}
};
/**
*
* @param {Buffer} buffer
* @param {int} offset
* @param {int} dataType
* @returns {number | string}
*/
function readDataFromBuffer(buffer, offset, dataType) {
switch (dataType) {
case DATA_TYPES.UINT:
return buffer.readUInt16BE(offset);
case DATA_TYPES.ASCII:
return buffer.toString('ascii', offset, offset + 2);
default:
return buffer.readInt16BE(offset);
}
}