nodbus-plus 0.8.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.readthedocs.yaml +35 -0
- package/LICENSE.md +21 -21
- package/README.md +163 -48
- package/docs/Makefile +20 -0
- package/docs/client/channel.rst +209 -0
- package/docs/client/nodbus_master_serial.rst +559 -0
- package/docs/client/nodbus_master_tcp.rst +573 -0
- package/docs/conf.py +41 -0
- package/docs/images/01-readcoils.png +0 -0
- package/docs/images/02-readinputs.png +0 -0
- package/docs/images/03-readholding.png +0 -0
- package/docs/images/04-readinputsreg.png +0 -0
- package/docs/images/05-writecoil.png +0 -0
- package/docs/images/06-writeregister.png +0 -0
- package/docs/images/15-writecoil.png +0 -0
- package/docs/images/16.png +0 -0
- package/docs/images/22-mask.png +0 -0
- package/docs/images/23.png +0 -0
- package/docs/images/7.png +0 -0
- package/docs/images/modbus_pdu.png +0 -0
- package/docs/images/serial_adu.png +0 -0
- package/docs/images/tcp_adu.png +0 -0
- package/docs/index.rst +30 -0
- package/docs/make.bat +35 -0
- package/docs/protocol/modbus_master.rst +276 -0
- package/docs/protocol/modbus_master_serial.rst +290 -0
- package/docs/protocol/modbus_master_tcp.rst +296 -0
- package/docs/protocol/modbus_server.rst +469 -0
- package/docs/protocol/modbus_server_serial.rst +543 -0
- package/docs/protocol/modbus_server_tcp.rst +365 -0
- package/docs/requirements.txt +4 -0
- package/docs/server/net_server.rst +242 -0
- package/docs/server/nodbus_serial_server.rst +652 -0
- package/docs/server/nodbus_tcp_server.rst +505 -0
- package/docs/starting.rst +192 -0
- package/docs/static/simple logo.jpg +0 -0
- package/package.json +39 -30
- package/samples/mb_serial_server.js +77 -0
- package/samples/mb_tcp_client.js +114 -0
- package/samples/mb_tcp_server.js +58 -0
- package/src/client/net/serialchannel.js +195 -0
- package/src/client/net/tcpchannel.js +233 -0
- package/src/client/net/udpchannel.js +243 -0
- package/src/client/nodbus_serial_client.js +577 -0
- package/src/client/nodbus_tcp_client.js +542 -0
- package/src/nodbus-plus.js +157 -110
- package/src/protocol/modbus_master.js +298 -961
- package/src/protocol/modbus_master_serial.js +247 -0
- package/src/protocol/modbus_master_tcp.js +219 -0
- package/src/protocol/modbus_server.js +936 -0
- package/src/protocol/modbus_server_serial.js +368 -0
- package/src/protocol/modbus_server_tcp.js +129 -0
- package/src/protocol/utils.js +296 -0
- package/src/server/net/serialserver.js +184 -0
- package/src/server/net/tcpserver.js +290 -0
- package/src/server/net/udpserver.js +242 -0
- package/src/server/nodbus_serial_server.js +238 -0
- package/src/server/nodbus_tcp_server.js +249 -0
- package/test/modbus_master.test.js +279 -0
- package/test/modbus_master_serial.test.js +124 -0
- package/test/modbus_master_tcp.test.js +178 -0
- package/test/modbus_server.test.js +506 -0
- package/test/modbus_server_serial.test.js +328 -0
- package/test/modbus_server_tcp.test.js +91 -0
- package/test/nodbus_client_serial.test.js +307 -0
- package/test/nodbus_client_tcp.test.js +334 -0
- package/test/nodbus_server_serial.test.js +255 -0
- package/test/nodbus_server_tcp.test.js +216 -0
- package/CHANGELOG.md +0 -27
- package/src/client/m_stcp_client.js +0 -214
- package/src/client/m_tcp_client.js +0 -234
- package/src/net/tcpclient.js +0 -173
- package/src/net/tcpserver.js +0 -329
- package/src/protocol/adu.js +0 -40
- package/src/protocol/ascii_adu.js +0 -139
- package/src/protocol/boolean_register.js +0 -78
- package/src/protocol/functions/Force_Multiple_Coils.js +0 -76
- package/src/protocol/functions/Force_Single_Coil.js +0 -54
- package/src/protocol/functions/Mask_Holding_Register.js +0 -47
- package/src/protocol/functions/Preset_Multiple_Registers.js +0 -53
- package/src/protocol/functions/Preset_Single_Register.js +0 -39
- package/src/protocol/functions/Read_Coil_Status.js +0 -59
- package/src/protocol/functions/Read_Holding_Registers.js +0 -52
- package/src/protocol/functions/Read_Input_Registers.js +0 -52
- package/src/protocol/functions/Read_Input_Status.js +0 -58
- package/src/protocol/mbap.js +0 -60
- package/src/protocol/modbus_device.js +0 -35
- package/src/protocol/modbus_slave.js +0 -522
- package/src/protocol/pdu.js +0 -70
- package/src/protocol/rtu_adu.js +0 -122
- package/src/protocol/serial_adu.js +0 -29
- package/src/protocol/tcp_adu.js +0 -84
- package/src/protocol/word_register.js +0 -122
- package/src/server/m_stcp_server.js +0 -310
- package/src/server/m_tcp_server.js +0 -295
- package/test/modbus-stcp-server-test.js +0 -72
- package/test/modbus-stcp-server-test1.js +0 -72
- package/test/modbus-tcp-client-test.js +0 -159
- package/test/modbus-tcp-server-test.js +0 -75
- package/test/modbus-tcp-server-test2.js +0 -75
- package/test/modbus_stcp_client.js +0 -149
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Hector E. Socarras
|
|
3
|
-
* @brief
|
|
4
|
-
* Se implementa la funcion 22 del protocolo de modbus.
|
|
5
|
-
* Debuelve un objeto pdu con el valor del registro solicitado.
|
|
6
|
-
*
|
|
7
|
-
* @param objeto pdu
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
var PDU = require('../pdu');
|
|
11
|
-
|
|
12
|
-
var MaskHoldingRegister = function (pdu){
|
|
13
|
-
|
|
14
|
-
var respPDU = new PDU();
|
|
15
|
-
|
|
16
|
-
//registro inicial ejemplo el registro 10 direccionado como 0x09 (9)
|
|
17
|
-
var targetRegister = pdu.modbus_data.readUInt16BE(0);
|
|
18
|
-
|
|
19
|
-
if (targetRegister > this.holdingRegisters.size){
|
|
20
|
-
//Creando exception 0x02
|
|
21
|
-
respPDU.modbus_function = pdu.modbus_function | 0x80;
|
|
22
|
-
respPDU.modbus_data[0] = 0x02;
|
|
23
|
-
|
|
24
|
-
this.emit('modbus_exception','ILLEGAL DATA ADDRESS');
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
let values = new Map();
|
|
28
|
-
|
|
29
|
-
let AND_MASK = pdu.modbus_data.readUInt16BE(2);
|
|
30
|
-
let OR_MASK = pdu.modbus_data.readUInt16BE(4);
|
|
31
|
-
|
|
32
|
-
//calculating value
|
|
33
|
-
let mask_value = (this.holdingRegisters.GetRegister(targetRegister).readUInt16LE() & AND_MASK) | (OR_MASK & ~AND_MASK );
|
|
34
|
-
let val = Buffer.alloc(2);
|
|
35
|
-
val.writeUInt16LE(mask_value);
|
|
36
|
-
this.holdingRegisters.SetRegister(val, targetRegister);
|
|
37
|
-
|
|
38
|
-
//Devolviendo un eco de la pdu.
|
|
39
|
-
respPDU = pdu
|
|
40
|
-
values.set(targetRegister, this.holdingRegisters.GetRegister(targetRegister).readUInt16LE());
|
|
41
|
-
this.emit('values', '4x', values);
|
|
42
|
-
return respPDU;
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
module.exports = MaskHoldingRegister;
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*@author Hector E. Socarras
|
|
3
|
-
*@brief
|
|
4
|
-
*Se implementa la funcion 16 del protocolo de modbus.
|
|
5
|
-
*Debuelve un objeto pdu con el valor de los registros solicitados.
|
|
6
|
-
*
|
|
7
|
-
*@param objeto pdu
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
var PDU = require('../pdu');
|
|
11
|
-
|
|
12
|
-
var PresetMultipleRegister = function (pdu) {
|
|
13
|
-
|
|
14
|
-
var respPDU = new PDU();
|
|
15
|
-
|
|
16
|
-
//registro inicial ejemplo el registro 10 direccionado como 0x09 (9)
|
|
17
|
-
var initRegister = pdu.modbus_data.readUInt16BE(0);
|
|
18
|
-
|
|
19
|
-
if (initRegister > this.holdingRegisters.size){
|
|
20
|
-
//Creando exception 0x02
|
|
21
|
-
respPDU.modbus_function = pdu.modbus_function | 0x80;
|
|
22
|
-
respPDU.modbus_data[0] = 0x02;
|
|
23
|
-
|
|
24
|
-
this.emit('modbus_exception','ILLEGAL DATA ADDRESS');
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
let values = new Map();
|
|
28
|
-
var startAddress = pdu.modbus_data.readUInt16BE(0);
|
|
29
|
-
|
|
30
|
-
//cantidad de registros a escribir
|
|
31
|
-
var numberOfRegisters = pdu.modbus_data.readUInt16BE(2);
|
|
32
|
-
|
|
33
|
-
//Cantidad de datos a forzar
|
|
34
|
-
var forceDataCount = pdu.modbus_data.readUInt8(4);
|
|
35
|
-
|
|
36
|
-
for(var i= 0; i < numberOfRegisters; i++){
|
|
37
|
-
let offset = startAddress+i;
|
|
38
|
-
let val = pdu.modbus_data.slice(5+2*i, 7+2*i).readUInt16BE();
|
|
39
|
-
this.holdingRegisters.DecodeRegister(pdu.modbus_data.slice(5+2*i, 7+2*i), startAddress+i);
|
|
40
|
-
values.set(offset, val);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
//creando la respuesta
|
|
44
|
-
respPDU.modbus_function = 0x10;
|
|
45
|
-
respPDU.modbus_data = Buffer.alloc(4);
|
|
46
|
-
pdu.modbus_data.copy(respPDU.modbus_data,0,0,4);
|
|
47
|
-
this.emit('values', '4x', values);
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
return respPDU;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
module.exports = PresetMultipleRegister;
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*@author Hector E. Socarras
|
|
3
|
-
*@brief
|
|
4
|
-
*Se implementa la funcion 06 del protocolo de modbus.
|
|
5
|
-
*Debuelve un objeto pdu con el valor del registro solicitado.
|
|
6
|
-
*
|
|
7
|
-
*@param objeto pdu
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
var PDU = require('../pdu');
|
|
11
|
-
|
|
12
|
-
var PresetSingleRegister = function (pdu){
|
|
13
|
-
|
|
14
|
-
var respPDU = new PDU();
|
|
15
|
-
|
|
16
|
-
//registro inicial ejemplo el registro 10 direccionado como 0x09 (9)
|
|
17
|
-
var targetRegister = pdu.modbus_data.readUInt16BE(0);
|
|
18
|
-
|
|
19
|
-
if (targetRegister > this.holdingRegisters.size){
|
|
20
|
-
//Creando exception 0x02
|
|
21
|
-
respPDU.modbus_function = pdu.modbus_function | 0x80;
|
|
22
|
-
respPDU.modbus_data[0] = 0x02;
|
|
23
|
-
|
|
24
|
-
this.emit('modbus_exception','ILLEGAL DATA ADDRESS');
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
let values = new Map();
|
|
28
|
-
this.holdingRegisters.DecodeRegister(pdu.modbus_data.slice(2), targetRegister);
|
|
29
|
-
|
|
30
|
-
values.set(targetRegister, pdu.modbus_data.slice(2).readUInt16BE());
|
|
31
|
-
//Devolviendo un eco de la pdu.
|
|
32
|
-
respPDU = pdu
|
|
33
|
-
this.emit('values', '4x', values);
|
|
34
|
-
return respPDU;
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
module.exports = PresetSingleRegister;
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*@author Hector E. Socarras
|
|
3
|
-
*@brief
|
|
4
|
-
*Se implementa la funcion 0x01 del protocolo de modbus.
|
|
5
|
-
*Debuelve un objeto pdu con el valor de las coil solicitadas.
|
|
6
|
-
*
|
|
7
|
-
*@param objeto pdu
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
var PDU = require('../pdu');
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var ReadCoilStatus = function (pdu) {
|
|
14
|
-
|
|
15
|
-
var respPDU = new PDU();
|
|
16
|
-
|
|
17
|
-
//coil inicial ejemplo el coil 20 direccionado como 0x13 (19)
|
|
18
|
-
var initCoil = pdu.modbus_data.readUInt16BE(0);
|
|
19
|
-
|
|
20
|
-
//Verificando q la coil solicitada exista
|
|
21
|
-
if(initCoil >= this.coils.size){
|
|
22
|
-
//Creando exception 0x02
|
|
23
|
-
respPDU.modbus_function = pdu.modbus_function | 0x80;
|
|
24
|
-
respPDU.modbus_data[0] = 0x02;
|
|
25
|
-
|
|
26
|
-
this.emit('modbus_exception','ILLEGAL DATA ADDRESS');
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
//cantidad de coils a leer
|
|
30
|
-
var numberOfCoils = pdu.modbus_data.readUInt16BE(2);
|
|
31
|
-
|
|
32
|
-
let masks = [0x01, 0x02, 0x04, 0x08, 0x010, 0x20, 0x40, 0x80];
|
|
33
|
-
|
|
34
|
-
//Calculando cantidad de bytes de la respuesta 12%8=1
|
|
35
|
-
//ejemplo 12 coils necesitan 2 bytes
|
|
36
|
-
var byte_count= numberOfCoils % 8 ? Math.floor(numberOfCoils/8+1):(numberOfCoils/8);
|
|
37
|
-
|
|
38
|
-
respPDU.modbus_function = 0x01;
|
|
39
|
-
respPDU.modbus_data = Buffer.alloc(byte_count+1);
|
|
40
|
-
respPDU.modbus_data[0]=byte_count;
|
|
41
|
-
|
|
42
|
-
//buffer temporal con tamano suficiente para copiar el segmento del registro con las coils solicitadas
|
|
43
|
-
var coil_segment = Buffer.alloc(byte_count);
|
|
44
|
-
|
|
45
|
-
for(var i = 0; i < numberOfCoils; i++){
|
|
46
|
-
if(this.coils.ReadData(initCoil + i)){
|
|
47
|
-
coil_segment[Math.floor(i/8)] = coil_segment[Math.floor(i/8)] | masks[i%8];
|
|
48
|
-
}
|
|
49
|
-
else coil_segment[Math.floor(i/8)] = coil_segment[Math.floor(i/8)] & (~masks[i%8]);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
//copiando las cois al campo de data de la PDU
|
|
53
|
-
coil_segment.copy(respPDU.modbus_data,1);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return respPDU;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
module.exports = ReadCoilStatus;
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*@author Hector E. Socarras
|
|
3
|
-
*@brief
|
|
4
|
-
*Se implementa la funcion 0x03 del protocolo de modbus.
|
|
5
|
-
*Debuelve un objeto pdu con el valor de los registros solicitados.
|
|
6
|
-
*
|
|
7
|
-
*@param objeto pdu
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
var PDU = require('../pdu');
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var ReadHoldingRegister = function (pdu) {
|
|
14
|
-
|
|
15
|
-
var respPDU = new PDU();
|
|
16
|
-
|
|
17
|
-
//registro inicial ejemplo el registro 10 direccionado como 0x09 (9)
|
|
18
|
-
var initRegister = pdu.modbus_data.readUInt16BE(0);
|
|
19
|
-
|
|
20
|
-
//Verificando q el registro solicitado exista
|
|
21
|
-
if(initRegister >= this.holdingRegisters.size){
|
|
22
|
-
//Creando exception 0x02
|
|
23
|
-
respPDU.modbus_function = pdu.modbus_function | 0x80;
|
|
24
|
-
respPDU.modbus_data[0] = 0x02;
|
|
25
|
-
|
|
26
|
-
this.emit('modbus_exception','ILLEGAL DATA ADDRESS');
|
|
27
|
-
}
|
|
28
|
-
else{
|
|
29
|
-
//cantidad de registros a leer
|
|
30
|
-
var numberOfRegisters = pdu.modbus_data.readUInt16BE(2);
|
|
31
|
-
|
|
32
|
-
////Calculando cantidad de bytes de la respuesta
|
|
33
|
-
var byte_count=2*numberOfRegisters;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
respPDU.modbus_data = Buffer.alloc(byte_count+1);
|
|
37
|
-
respPDU.modbus_function = 0x03;
|
|
38
|
-
respPDU.modbus_data[0]=byte_count;
|
|
39
|
-
|
|
40
|
-
for(var i = 0; i < numberOfRegisters; i++){
|
|
41
|
-
this.holdingRegisters.EncodeRegister(initRegister + i).copy(respPDU.modbus_data, 1 + 2*i)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return respPDU;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
module.exports = ReadHoldingRegister;
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*@author Hector E. Socarras
|
|
3
|
-
*@brief
|
|
4
|
-
*Se implementa la funcion 0x04 del protocolo de modbus.
|
|
5
|
-
*Debuelve un objeto pdu con el valor de los registros solicitados.
|
|
6
|
-
*
|
|
7
|
-
*@param objeto pdu
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
var PDU = require('../pdu');
|
|
11
|
-
|
|
12
|
-
var ReadInputRegister = function (pdu) {
|
|
13
|
-
|
|
14
|
-
var respPDU = new PDU();
|
|
15
|
-
|
|
16
|
-
//registro inicial ejemplo el registro 10 direccionado como 0x09 (9)
|
|
17
|
-
var initRegister = pdu.modbus_data.readUInt16BE(0);
|
|
18
|
-
|
|
19
|
-
//Verificando q el registro solicitado exista
|
|
20
|
-
if(initRegister >= this.inputRegisters.size){
|
|
21
|
-
//Creando exception 0x02
|
|
22
|
-
respPDU.modbus_function = pdu.modbus_function | 0x80;
|
|
23
|
-
respPDU.modbus_data[0] = 0x02;
|
|
24
|
-
|
|
25
|
-
this.emit('modbus_exception','ILLEGAL DATA ADDRESS');
|
|
26
|
-
}
|
|
27
|
-
else{
|
|
28
|
-
//cantidad de registros a leer
|
|
29
|
-
var numberOfRegisters = pdu.modbus_data.readUInt16BE(2);
|
|
30
|
-
|
|
31
|
-
////Calculando cantidad de bytes de la respuesta
|
|
32
|
-
var byte_count=2*numberOfRegisters;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
respPDU.modbus_data = Buffer.alloc(byte_count+1);
|
|
36
|
-
respPDU.modbus_function = 0x04;
|
|
37
|
-
respPDU.modbus_data[0]=byte_count;
|
|
38
|
-
|
|
39
|
-
for(var i = 0; i < numberOfRegisters; i++){
|
|
40
|
-
this.inputRegisters.EncodeRegister(initRegister + i).copy(respPDU.modbus_data, 1 + 2*i)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return respPDU;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
module.exports = ReadInputRegister;
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*@author Hector E. Socarras
|
|
3
|
-
*@brief
|
|
4
|
-
*Se implementa la funcion 0x02 del protocolo de modbus.
|
|
5
|
-
*Debuelve un objeto pdu con el valor de las inputs solicitadas.
|
|
6
|
-
*
|
|
7
|
-
*@param objeto pdu
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
var PDU = require('../pdu');
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var ReadInputStatus = function (pdu) {
|
|
14
|
-
|
|
15
|
-
var respPDU = new PDU();
|
|
16
|
-
|
|
17
|
-
//input inicial ejemplo el input 20 direccionado como 0x13 (19)
|
|
18
|
-
var initInput = pdu.modbus_data.readUInt16BE(0);
|
|
19
|
-
|
|
20
|
-
//Verificando q la input solicitada exista
|
|
21
|
-
if(initInput >= this.inputs.size){
|
|
22
|
-
//Creando exception 0x02
|
|
23
|
-
respPDU.modbus_function = pdu.modbus_function | 0x80;
|
|
24
|
-
respPDU.modbus_data[0] = 0x02;
|
|
25
|
-
|
|
26
|
-
this.emit('modbus_exception','ILLEGAL DATA ADDRESS');
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
//cantidad de inputs a leer
|
|
30
|
-
var numberOfInputs = pdu.modbus_data.readUInt16BE(2);
|
|
31
|
-
|
|
32
|
-
let masks = [0x01, 0x02, 0x04, 0x08, 0x010, 0x20, 0x40, 0x80];
|
|
33
|
-
|
|
34
|
-
//Calculando cantidad de bytes de la respuesta 12%8=1
|
|
35
|
-
//ejemplo 12 inputs necesitan 2 bytes
|
|
36
|
-
var byte_count= numberOfInputs % 8 ? Math.floor(numberOfInputs/8+1):(numberOfInputs/8);
|
|
37
|
-
|
|
38
|
-
respPDU.modbus_function = 0x02;
|
|
39
|
-
respPDU.modbus_data = Buffer.alloc(byte_count+1);
|
|
40
|
-
respPDU.modbus_data[0]=byte_count;
|
|
41
|
-
|
|
42
|
-
//buffer temporal con tamano suficiente para copiar el segmento del registro con las inputs solicitadas
|
|
43
|
-
var input_segment = Buffer.alloc(byte_count);
|
|
44
|
-
|
|
45
|
-
for(var i = 0; i < numberOfInputs; i++){
|
|
46
|
-
if(this.inputs.ReadData(initInput + i)){
|
|
47
|
-
input_segment[Math.floor(i/8)] = input_segment[Math.floor(i/8)] | masks[i%8];
|
|
48
|
-
}
|
|
49
|
-
else input_segment[Math.floor(i/8)] = input_segment[Math.floor(i/8)] & (~masks[i%8]);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
//copiando las cois al campo de data de la PDU
|
|
53
|
-
input_segment.copy(respPDU.modbus_data,1);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return respPDU;
|
|
57
|
-
}
|
|
58
|
-
module.exports = ReadInputStatus;
|
package/src/protocol/mbap.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
** Modbus Protocol Data Unit base class.
|
|
3
|
-
* @module protocol/mbap
|
|
4
|
-
* @author Hector E. Socarras.
|
|
5
|
-
* @version 0.4.0
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Class representing a modbus tcp header.
|
|
10
|
-
*/
|
|
11
|
-
class MBAP {
|
|
12
|
-
/**
|
|
13
|
-
* Create MBAP.
|
|
14
|
-
* @param {Buffer} mbapRaw fragment off modbus tcp frame corresponding to header.
|
|
15
|
-
*/
|
|
16
|
-
constructor(mbapRaw = Buffer.alloc(7)){
|
|
17
|
-
|
|
18
|
-
//buffer with raw header
|
|
19
|
-
this.mbapBuffer = mbapRaw;
|
|
20
|
-
|
|
21
|
-
this.transactionID =0x0;
|
|
22
|
-
this.protocolID = 0x0;
|
|
23
|
-
this.length = 0x0;
|
|
24
|
-
this.unitID = 0x0;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* function to make mbap frame from function and data fields
|
|
29
|
-
*/
|
|
30
|
-
MakeBuffer(){
|
|
31
|
-
|
|
32
|
-
var buff = Buffer.alloc(7);
|
|
33
|
-
buff.writeUInt16BE(this.transactionID,0);
|
|
34
|
-
buff.writeUInt16BE(this.protocolID,2);
|
|
35
|
-
buff.writeUInt16BE(this.length,4);
|
|
36
|
-
buff.writeUInt8(this.unitID,6);
|
|
37
|
-
|
|
38
|
-
this.mbapBuffer = buff;
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
*function to parse the mbap buffer to extract function and data fields
|
|
44
|
-
* @throws {string}
|
|
45
|
-
*/
|
|
46
|
-
ParseBuffer(){
|
|
47
|
-
if(this.mbapBuffer.length == 7){
|
|
48
|
-
this.transactionID = this.mbapBuffer.readUInt16BE(0);
|
|
49
|
-
this.protocolID = this.mbapBuffer.readUInt16BE(2);
|
|
50
|
-
this.length = this.mbapBuffer.readUInt16BE(4);
|
|
51
|
-
this.unitID = this.mbapBuffer.readUInt8(6);
|
|
52
|
-
}
|
|
53
|
-
else{
|
|
54
|
-
throw new Error('wrong mbap buffer');
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
module.exports = MBAP;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
** Modbus device module.
|
|
3
|
-
* @module protocol/modbus-device
|
|
4
|
-
* @author Hector E. Socarras.
|
|
5
|
-
* @version 0.4.0
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const EventEmitter = require('events');
|
|
9
|
-
const PDU = require('./pdu');
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Class representing a modbus device.
|
|
13
|
-
* @extends EventEmitter
|
|
14
|
-
*/
|
|
15
|
-
class ModbusDevice extends EventEmitter {
|
|
16
|
-
/**
|
|
17
|
-
* Create a Modbus Device.
|
|
18
|
-
*/
|
|
19
|
-
constructor(){
|
|
20
|
-
super();
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Function to create a new protocol data unit
|
|
27
|
-
* @return {object} PDU
|
|
28
|
-
*/
|
|
29
|
-
CreatePDU() {
|
|
30
|
-
return new PDU();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
module.exports = ModbusDevice;
|