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,29 +0,0 @@
1
- /**
2
- ** Modbus TCP Aplication Data Unit base class.
3
- * @module protocol/serial_adu
4
- * @author Hector E. Socarras.
5
- * @version 0.4.0
6
- */
7
-
8
- const ADU = require('./adu');
9
-
10
-
11
- module.exports = class SerialADU extends ADU {
12
- constructor(aduRaw =Buffer.alloc(1)){
13
- super(aduRaw)
14
-
15
- //propiedad error cheking
16
- this.errorCheck = 0;
17
- }
18
-
19
- static isAsciiAdu(aduBuffer){
20
- let firstByte = aduBuffer[0];
21
- let lastByte = aduBuffer[aduBuffer.length - 1];
22
- let preLastByte = aduBuffer[aduBuffer.length - 2];
23
-
24
- if(firstByte == 0x3A & preLastByte == 0x0D & lastByte == 0x0A){
25
- return true;
26
- }
27
- else return false
28
- }
29
- }
@@ -1,84 +0,0 @@
1
- /**
2
- ** Modbus TCP Aplication Data Unit base class.
3
- * @module protocol/tcp_adu
4
- * @author Hector E. Socarras.
5
- * @version 0.4.0
6
- */
7
-
8
- const ADU = require('./adu');
9
- const MBAP = require('./mbap');
10
-
11
- /**
12
- * Class representing a modbus tcp aplication data unit.
13
- * @extends ADU
14
- */
15
- class TcpADU extends ADU {
16
- /**
17
- * Create a ADU.
18
- * @param {Buffer} aduRaw Frame modbus.
19
- */
20
- constructor(aduRaw = Buffer.alloc(1)){
21
- super(aduRaw);
22
-
23
- this.transactionCounter = 0;
24
-
25
- /**
26
- * Header of frame modbus tcp
27
- * @type {object}
28
- */
29
- this.mbap = new MBAP();
30
- }
31
-
32
- /**
33
- * function to make adu frame from MBAP and PDU object
34
- */
35
- MakeBuffer(){
36
-
37
- //creando el buffer de la pdu
38
- this.pdu.MakeBuffer();
39
-
40
- //creando en buffer del mbap
41
- this.mbap.transactionID = this.transactionCounter;
42
- this.mbap.protocolID = 0;
43
- this.mbap.length = this.pdu.pduBuffer.length+1;
44
- this.mbap.unitID = this.address;
45
- this.mbap.MakeBuffer();
46
-
47
- var buff = Buffer.alloc(this.pdu.pduBuffer.length+this.mbap.mbapBuffer.length);
48
-
49
- this.mbap.mbapBuffer.copy(buff);
50
- this.pdu.pduBuffer.copy(buff,7);
51
-
52
- this.aduBuffer = buff;
53
- }
54
-
55
- /**
56
- *function to parse the adu buffer to make MBAP and PDU object
57
- * @throws {string}
58
- */
59
- ParseBuffer() {
60
-
61
- if(this.aduBuffer.length > 7) {
62
- try {
63
- this.mbap.mbapBuffer = this.aduBuffer.slice(0,7);
64
- this.mbap.ParseBuffer();
65
- this.address = this.mbap.unitID;
66
- this.pdu.pduBuffer = this.aduBuffer.slice(7);
67
- this.pdu.ParseBuffer();
68
-
69
- }
70
- catch(err)
71
- {
72
- throw err;
73
- }
74
- }
75
- else {
76
- throw new Error('adu buffer not contain a valid frame');
77
- }
78
-
79
- }
80
-
81
-
82
- }
83
-
84
- module.exports = TcpADU;
@@ -1,122 +0,0 @@
1
- /**
2
- ** Word datatype memory.
3
- * @module protocol/word_register
4
- * @author Hector E. Socarras.
5
- * @version 0.4.0
6
- */
7
-
8
- /**
9
- * Class representing a word memory area.
10
- */
11
- class WordRegister {
12
- /**
13
- * Create a word register.
14
- * @param {number} size total amount of references (inputs or holdings registers).
15
- */
16
- constructor(size = 1024){
17
-
18
- /**
19
- *core. using litle endian encoding
20
- *@type {Buffer}
21
- */
22
- this.registerBuffer = Buffer.alloc(size * 2);
23
-
24
- /**
25
- *@type {number}
26
- */
27
- this.size = size;
28
-
29
-
30
- }
31
-
32
-
33
-
34
- /**
35
- *function to encode a register to send through a stream.
36
- * protocol send in BE; register are store in LE
37
- *@param {number} dataAddress address of register
38
- *@return {buffer}
39
- */
40
- EncodeRegister(dataAddress = 0){
41
- if(dataAddress <= this.size){
42
- let offset = dataAddress * 2;
43
-
44
- let buffRegister = Buffer.alloc(2);
45
- buffRegister[0] = this.registerBuffer[offset + 1];
46
- buffRegister[1] = this.registerBuffer[offset];
47
- return buffRegister;
48
- }
49
- else{
50
- return false;
51
- }
52
- }
53
-
54
- /**
55
- *function to decode a register receive through a stream.
56
- * protocol send in BE; register are store in LE
57
- *@param {buffer} value
58
- *@param {number} dataAddress address of register
59
- */
60
- DecodeRegister(value, dataAddress = 0){
61
- if(dataAddress <= this.size){
62
- let offset = dataAddress * 2;
63
-
64
- this.registerBuffer[offset] = value[1];
65
- this.registerBuffer[offset + 1] = value[0];
66
- return true;
67
-
68
- }
69
- else{
70
- return false;
71
- }
72
- }
73
-
74
- /**
75
- * function to set the register
76
- * @param {Buffer} value a Buffer with value encode in litleendian
77
- * @param {number} dataAddress address of register
78
- * @return {boolean} true if success
79
- */
80
- SetRegister(value, dataAddress = 0){
81
- if(dataAddress <= this.size){
82
- let offset = dataAddress * 2;
83
- if (value instanceof Buffer && value.length == 2) {
84
- value.copy(this.registerBuffer, offset)
85
- return true;
86
- }
87
- else{
88
- throw new typeError('Value must be a size 2 Buffer');
89
- }
90
-
91
- }
92
- else{
93
- return false;
94
- }
95
- }
96
-
97
- /**
98
- * function to get the register
99
- * @param {number} dataAddress address of register
100
- * @return {buffer}
101
- */
102
- GetRegister(dataAddress = 0){
103
- if(dataAddress <= this.size){
104
- let offset = dataAddress * 2;
105
-
106
- return this.registerBuffer.slice(offset, offset + 2);
107
- }
108
- else{
109
- return false;
110
- }
111
- }
112
-
113
- /**
114
- * function to rezise the buffer of register
115
- * @param {number} newSise
116
- */
117
- ReSize(newSize){
118
- this.registerBuffer = Buffer.alloc(newSize * 2);
119
- }
120
- }
121
-
122
- module.exports = WordRegister;
@@ -1,310 +0,0 @@
1
- /**
2
- * Modbus Serial encapsulated on Tcp server module.
3
- * @module server/m_stcp_server.
4
- * @author Hector E. Socarras.
5
- * @version 0.4.0
6
- */
7
-
8
- const ModbusSlave = require('../protocol/modbus_slave');
9
- const TcpServer = require('../net/tcpserver');
10
- const RTU_ADU = require('../protocol/rtu_adu');
11
- const ASCII_ADU = require('../protocol/ascii_adu');
12
-
13
- /**
14
- * Class representing a modbus serial over tcp server.
15
- * @extends ModbusSlave
16
- */
17
- class ModbusSTCPServer extends ModbusSlave {
18
- /**
19
- * Create a Modbus Tcp Server.
20
- * @param {number} p Port to listen.
21
- * @param {string} mode mode of work. 'rtu' frame rtu only, 'ascii' frame ascii only, 'aut' (default) both mode
22
- */
23
- constructor(p = 502, modbusAddress = 1, mode = 'aut'){
24
- super(modbusAddress);
25
-
26
- var self = this;
27
-
28
- /**
29
- * network layer
30
- * @type {object}
31
- */
32
- this.tcpServer = new TcpServer();
33
-
34
- //Adding listeners to tcpServer events
35
-
36
- this.tcpServer.onData = this.ProcessModbusIndication.bind(this);
37
-
38
- /**
39
- * @fires ModbusTCPServer#connection
40
- */
41
- this.tcpServer.onConnection = function EmitConnection (socket) {
42
- /**
43
- * connection event.
44
- * Emited when new connecton is sablished
45
- * @event ModbusTCPServer#connection
46
- * @type {object}
47
- * @see https://nodejs.org/api/net.html
48
- */
49
- this.emit('connection',socket);
50
- }.bind(this);
51
-
52
-
53
- /**
54
- * Event connection closed
55
- * Emited when socket closed
56
- * @see https://nodejs.org/api/net.html
57
- * @fires ModbusTCPServer#connection-closed
58
- */
59
- this.tcpServer.onConnectionClose = function EmitConnectionClosed(socket){
60
- /**
61
- * connection-closed event.
62
- * @event ModbusTCPServer#connection-closed
63
- * @type {object}
64
- */
65
- this.emit('connection-closed', socket)
66
- }.bind(this);
67
-
68
- /**
69
- * Event access denied
70
- * Emited when new connecton is rejected by filter rules
71
- * @fires ModbusTCPServer#access-denied
72
- */
73
- this.tcpServer.onAccessDenied = function EmitAccesDenied(socket){
74
- /**
75
- * access-denied event.
76
- * @event ModbusTCPServer#access-denied
77
- * @type {object}
78
- */
79
- this.emit('access-denied', socket);
80
- }.bind(this);
81
-
82
- /**
83
- * Event listening
84
- * Emited when server is listening
85
- * @see https://nodejs.org/api/net.html
86
- * @fires ModbusTCPServer#listening
87
- */
88
- this.tcpServer.onListening = function EmitListening(port){
89
- /**
90
- * listening event.
91
- * @event ModbusTCPServer#listening
92
- * @type {number}
93
- */
94
- this.emit('listening',self.port);
95
- }.bind(this);
96
-
97
- /**
98
- * Event closed
99
- * Emited when server is closed
100
- * @see https://nodejs.org/api/net.html
101
- * @fires ModbusTCPServer#closed
102
- */
103
- this.tcpServer.onServerClose = function EmitClosed(){
104
- /**
105
- * closed event.
106
- * @event ModbusTCPServer#closed
107
- */
108
- this.emit('closed');
109
- }.bind(this);
110
-
111
- /**
112
- * Event error
113
- * Emited when error hapen
114
- * @fires ModbusTCPServer#error
115
- */
116
- this.tcpServer.onError = function EmitError(err){
117
- /**
118
- * error event.
119
- * @event ModbusTCPServer#error
120
- */
121
- this.emit('error', err);
122
- }.bind(this);
123
-
124
- /**
125
- * Event response
126
- * Emited when response is send to master
127
- * @fires ModbusTCPServer#response
128
- */
129
- this.tcpServer.onWrite = function EmitResponse(resp){
130
- /**
131
- * response event.
132
- * @event ModbusTCPServer#response
133
- */
134
- this.emit('response', resp);
135
- }.bind(this);
136
-
137
- /**
138
- * Event client disconnect
139
- * Emited when client send fin packet
140
- * @fires ModbusTCPServer#client-disconnect
141
- */
142
- this.tcpServer.onClientEnd = function EmitClientDisconnect(socket){
143
- /**
144
- * client-disconnect event.
145
- * @event ModbusTCPServer#client-disconnect
146
- */
147
- this.emit('client-disconnect',socket);
148
- }
149
-
150
- /**
151
- * port
152
- * @type {number}
153
- * @public
154
- */
155
- Object.defineProperty(self, 'port', {
156
- get : function(){
157
- return self.tcpServer.port;
158
- },
159
- set : function(p){
160
- self.tcpServer.port = p;
161
- }
162
- })
163
- this.port = p;
164
-
165
-
166
-
167
- /**
168
- * mode
169
- * @type {string}
170
- */
171
- this.mode = mode;
172
-
173
- /**
174
- * listening status
175
- * @type {bool}
176
- * @public
177
- */
178
- Object.defineProperty(self, 'isListening',{
179
- get: function(){
180
- return self.tcpServer.isListening;
181
- }
182
- })
183
-
184
- /**
185
- * max client
186
- * @type {number}
187
- * @public
188
- */
189
- Object.defineProperty(self, 'maxConnections',{
190
- get: function(){
191
- return self.tcpServer.maxConnections;
192
- },
193
- set: function(max){
194
- self.tcpServer.maxConnections = max;
195
- }
196
- })
197
-
198
- //Sellando el tcpServer
199
- Object.defineProperty(self, 'tcpServer', {
200
- enumerable:false,
201
- writable:false,
202
- configurable:false
203
- })
204
-
205
- }
206
-
207
- /**
208
- * Function to start the server
209
- */
210
- Start(){
211
- this.tcpServer.Start();
212
- }
213
-
214
- /**
215
- * Function to stop the server
216
- */
217
- Stop(){
218
- this.tcpServer.Stop();
219
- }
220
-
221
- /**
222
- * Function to execute when data are recive
223
- * @param {Buffer} aduBuffer frame received by server
224
- * @return {Buffer} response;
225
- * @fires ModbusTCPServer#indication {Buffer}
226
- */
227
- ProcessModbusIndication(aduBuffer){
228
-
229
- /**
230
- * indication event.
231
- * @event ModbusTCPServer#indication
232
- */
233
- this.emit('indication', aduBuffer);
234
-
235
- let ADU;
236
- var indicationADU;
237
-
238
- switch (this.mode){
239
- case 'rtu':
240
- ADU = RTU_ADU;
241
- break;
242
- case 'ascii':
243
- ADU = ASCII_ADU;
244
- break;
245
- case 'aut':
246
- (ASCII_ADU.isAsciiAdu(aduBuffer)) ? ADU = ASCII_ADU : ADU = RTU_ADU;
247
- }
248
-
249
- indicationADU = new ADU(aduBuffer);
250
-
251
-
252
- //checking adu
253
- if (this.AnalizeADU(indicationADU)){
254
- return Buffer.alloc(0);
255
- }
256
- else{
257
- //adu ok
258
- indicationADU.ParseBuffer();
259
- //creando la respuesta
260
- var responsePDU = this.BuildResponse(indicationADU.pdu);
261
-
262
- if(indicationADU.address == 0){
263
- //broadcast no response
264
- return Buffer.alloc(0);
265
- }
266
- else{
267
- //response
268
- if(responsePDU != null){
269
- var modbusResponse = new ADU();
270
- modbusResponse.address = indicationADU.address;
271
- modbusResponse.pdu = responsePDU;
272
- modbusResponse.MakeBuffer();
273
-
274
- return modbusResponse.aduBuffer;
275
- }
276
- else{
277
- return Buffer.alloc(0);
278
- }
279
- }
280
-
281
- }
282
- }
283
-
284
-
285
- /**
286
- * Make the response modbus tcp header
287
- * @param {buffer} adu frame off modbus indication
288
- * @return {number} error code. 1- error, 0-no errror
289
- * @fires ModbusTCPServer#error {object}
290
- */
291
- AnalizeADU(adu){
292
- try{
293
- adu.ParseBuffer();
294
-
295
- if ((adu.address != this.modbusAddress & adu.address != 0) | adu.address > 247){
296
- //ignore the frame if address missmatch
297
- return 1;
298
- }
299
- else{
300
- return 0;
301
- }
302
- }
303
- catch(e){
304
- this.emit('error', e);
305
- return 1;
306
- }
307
- }
308
- }
309
-
310
- module.exports = ModbusSTCPServer;