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.
Files changed (101) hide show
  1. package/.readthedocs.yaml +35 -0
  2. package/LICENSE.md +21 -21
  3. package/README.md +163 -48
  4. package/docs/Makefile +20 -0
  5. package/docs/client/channel.rst +209 -0
  6. package/docs/client/nodbus_master_serial.rst +559 -0
  7. package/docs/client/nodbus_master_tcp.rst +573 -0
  8. package/docs/conf.py +41 -0
  9. package/docs/images/01-readcoils.png +0 -0
  10. package/docs/images/02-readinputs.png +0 -0
  11. package/docs/images/03-readholding.png +0 -0
  12. package/docs/images/04-readinputsreg.png +0 -0
  13. package/docs/images/05-writecoil.png +0 -0
  14. package/docs/images/06-writeregister.png +0 -0
  15. package/docs/images/15-writecoil.png +0 -0
  16. package/docs/images/16.png +0 -0
  17. package/docs/images/22-mask.png +0 -0
  18. package/docs/images/23.png +0 -0
  19. package/docs/images/7.png +0 -0
  20. package/docs/images/modbus_pdu.png +0 -0
  21. package/docs/images/serial_adu.png +0 -0
  22. package/docs/images/tcp_adu.png +0 -0
  23. package/docs/index.rst +30 -0
  24. package/docs/make.bat +35 -0
  25. package/docs/protocol/modbus_master.rst +276 -0
  26. package/docs/protocol/modbus_master_serial.rst +290 -0
  27. package/docs/protocol/modbus_master_tcp.rst +296 -0
  28. package/docs/protocol/modbus_server.rst +469 -0
  29. package/docs/protocol/modbus_server_serial.rst +543 -0
  30. package/docs/protocol/modbus_server_tcp.rst +365 -0
  31. package/docs/requirements.txt +4 -0
  32. package/docs/server/net_server.rst +242 -0
  33. package/docs/server/nodbus_serial_server.rst +652 -0
  34. package/docs/server/nodbus_tcp_server.rst +505 -0
  35. package/docs/starting.rst +192 -0
  36. package/docs/static/simple logo.jpg +0 -0
  37. package/package.json +39 -30
  38. package/samples/mb_serial_server.js +77 -0
  39. package/samples/mb_tcp_client.js +114 -0
  40. package/samples/mb_tcp_server.js +58 -0
  41. package/src/client/net/serialchannel.js +195 -0
  42. package/src/client/net/tcpchannel.js +233 -0
  43. package/src/client/net/udpchannel.js +243 -0
  44. package/src/client/nodbus_serial_client.js +577 -0
  45. package/src/client/nodbus_tcp_client.js +542 -0
  46. package/src/nodbus-plus.js +157 -110
  47. package/src/protocol/modbus_master.js +298 -961
  48. package/src/protocol/modbus_master_serial.js +247 -0
  49. package/src/protocol/modbus_master_tcp.js +219 -0
  50. package/src/protocol/modbus_server.js +936 -0
  51. package/src/protocol/modbus_server_serial.js +368 -0
  52. package/src/protocol/modbus_server_tcp.js +129 -0
  53. package/src/protocol/utils.js +296 -0
  54. package/src/server/net/serialserver.js +184 -0
  55. package/src/server/net/tcpserver.js +290 -0
  56. package/src/server/net/udpserver.js +242 -0
  57. package/src/server/nodbus_serial_server.js +238 -0
  58. package/src/server/nodbus_tcp_server.js +249 -0
  59. package/test/modbus_master.test.js +279 -0
  60. package/test/modbus_master_serial.test.js +124 -0
  61. package/test/modbus_master_tcp.test.js +178 -0
  62. package/test/modbus_server.test.js +506 -0
  63. package/test/modbus_server_serial.test.js +328 -0
  64. package/test/modbus_server_tcp.test.js +91 -0
  65. package/test/nodbus_client_serial.test.js +307 -0
  66. package/test/nodbus_client_tcp.test.js +334 -0
  67. package/test/nodbus_server_serial.test.js +255 -0
  68. package/test/nodbus_server_tcp.test.js +216 -0
  69. package/CHANGELOG.md +0 -27
  70. package/src/client/m_stcp_client.js +0 -214
  71. package/src/client/m_tcp_client.js +0 -234
  72. package/src/net/tcpclient.js +0 -173
  73. package/src/net/tcpserver.js +0 -329
  74. package/src/protocol/adu.js +0 -40
  75. package/src/protocol/ascii_adu.js +0 -139
  76. package/src/protocol/boolean_register.js +0 -78
  77. package/src/protocol/functions/Force_Multiple_Coils.js +0 -76
  78. package/src/protocol/functions/Force_Single_Coil.js +0 -54
  79. package/src/protocol/functions/Mask_Holding_Register.js +0 -47
  80. package/src/protocol/functions/Preset_Multiple_Registers.js +0 -53
  81. package/src/protocol/functions/Preset_Single_Register.js +0 -39
  82. package/src/protocol/functions/Read_Coil_Status.js +0 -59
  83. package/src/protocol/functions/Read_Holding_Registers.js +0 -52
  84. package/src/protocol/functions/Read_Input_Registers.js +0 -52
  85. package/src/protocol/functions/Read_Input_Status.js +0 -58
  86. package/src/protocol/mbap.js +0 -60
  87. package/src/protocol/modbus_device.js +0 -35
  88. package/src/protocol/modbus_slave.js +0 -522
  89. package/src/protocol/pdu.js +0 -70
  90. package/src/protocol/rtu_adu.js +0 -122
  91. package/src/protocol/serial_adu.js +0 -29
  92. package/src/protocol/tcp_adu.js +0 -84
  93. package/src/protocol/word_register.js +0 -122
  94. package/src/server/m_stcp_server.js +0 -310
  95. package/src/server/m_tcp_server.js +0 -295
  96. package/test/modbus-stcp-server-test.js +0 -72
  97. package/test/modbus-stcp-server-test1.js +0 -72
  98. package/test/modbus-tcp-client-test.js +0 -159
  99. package/test/modbus-tcp-server-test.js +0 -75
  100. package/test/modbus-tcp-server-test2.js +0 -75
  101. 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;
@@ -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;