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,234 +0,0 @@
1
- /**
2
- ** Modbus Tcp Client module.
3
- * @module client/modbus_tcp_client
4
- * @author Hector E. Socarras.
5
- * @version 0.8.0
6
- */
7
-
8
- const ModbusMaster = require('../protocol/modbus_master');
9
- const TcpClient = require('../net/tcpclient');
10
- const ADU = require('../protocol/tcp_adu');
11
-
12
-
13
-
14
- /**
15
- * Class representing a modbus tcp client.
16
- * @extends ModbusMaster
17
- */
18
- class ModbusTCPClient extends ModbusMaster {
19
- /**
20
- * Create a Modbus Tcp Client.
21
- */
22
- constructor(){
23
- super();
24
-
25
- var self = this;
26
-
27
- var transactionCountValue = 1;
28
-
29
- /**
30
- * tcp layer
31
- * @type {object}
32
- */
33
- this.netClient = new TcpClient();
34
-
35
- //asociando el evento data del netClient con la funcion ProcessResponse
36
- this.netClient.onData = this.ProcessResponse.bind(this);
37
-
38
- /**
39
- * Emit connect and ready events
40
- * @param {object} target Socket object
41
- * @fires ModbusTCPClient#connect {object}
42
- * @fires ModbusTCPClient#ready
43
- */
44
- this.netClient.onConnect = self._EmitConnect.bind(this);
45
-
46
-
47
- /**
48
- *Emit disconnect event
49
- * @param {string} id
50
- * @param {object} had_error
51
- * @fires ModbusTCPClient#disconnect {object}
52
- */
53
- function EmitDisconnect(id, had_error){
54
-
55
- let slave = this.slaveList.get(id);
56
-
57
- /**
58
- * disconnect event.
59
- * @event ModbusTCPClient#disconnect
60
- */
61
- this.emit('disconnect',id, had_error);
62
- slave.isReady = false;
63
- }
64
- this.netClient.onClose = EmitDisconnect.bind(this);
65
-
66
- /**
67
- *Emit error event
68
- * @param {object} error
69
- * @fires ModbusTCPClient#error {object}
70
- */
71
- function EmitError (id, err){
72
-
73
- /**
74
- * error event.
75
- * @event ModbusTCPClient#error
76
- * @type {object}
77
- */
78
- this.emit('error',id, err);
79
- }
80
- this.netClient.onError = EmitError.bind(this);
81
-
82
- /**
83
- * Emit timeout event *
84
- * @fires ModbusTCPClient#timeout
85
- */
86
- this.netClient.onTimeOut = self._EmitTimeout.bind(this);
87
-
88
- /**
89
- * Emit Indication event *
90
- * @fires ModbusTCPClient#indication
91
- */
92
- function EmitIndication(id, data){
93
- /**
94
- * indication event.
95
- * @event ModbusTCPClient#indication
96
- */
97
- this.emit('indication',id, data);
98
- }
99
- this.netClient.onWrite = EmitIndication.bind(this);
100
-
101
- /**
102
- * number of transaction
103
- * @type {number}
104
- */
105
- Object.defineProperty(self, 'transactionCounter', {
106
- get: function(){
107
- return transactionCountValue;
108
- },
109
- set: function(value){
110
- if(value <= 0xFFF0 ){
111
- if(value = transactionCountValue + 1){
112
- transactionCountValue = value;
113
- }
114
- }
115
- else{
116
- transactionCountValue = 1;
117
- }
118
- },
119
- enumerable: false,
120
- configurable: false
121
- } )
122
-
123
- }
124
-
125
-
126
- /**
127
- * function to create a adu
128
- * @param {object} pdu of request
129
- * @return {object} adu request
130
- */
131
- CreateADU(id, pdu){
132
- var adu = new ADU();
133
- let slave = this.slaveList.get(id);
134
-
135
- adu.pdu = pdu;
136
- adu.address = slave.modbusAddress;
137
- adu.transactionCounter = this.transactionCounter++
138
-
139
- adu.MakeBuffer();
140
- return adu;
141
- }
142
-
143
- /**
144
- * function to pasrse server response
145
- * @param {Buffer} aduBuffer frame of response
146
- * @return {object} map Object whit register:value pairs
147
- * @fires ModbusTCPClient#modbus_exception {object}
148
- * @fires ModbusTCPClient#error {object}
149
- */
150
- ParseResponse(id, aduBuffer) {
151
-
152
- let resp = new ADU(aduBuffer);
153
- let slave = this.slaveList.get(id);
154
-
155
- try{
156
- resp.ParseBuffer();
157
- //chekeo el transactionID
158
- if(resp.mbap.transactionID != slave.currentRequest.mbap.transactionID){
159
- this.emit('modbus_exception', id, "Wrong Transaction ID");
160
- return false;
161
- }
162
- else if((aduBuffer.length - 6) != resp.mbap.length) {
163
- this.emit('modbus_exception',id, "Header ByteCount Mismatch");
164
- return false;
165
- }
166
- else {
167
- return this.ParseResponsePDU(id, resp.pdu);
168
- }
169
- }
170
- catch(err){
171
- throw err;
172
- }
173
-
174
- }
175
-
176
- /**
177
- *Stablish connection to servers
178
- */
179
- Start(id){
180
- let self = this;
181
- let successPromise;
182
-
183
- if(id){
184
- let slave = self.slaveList.get(id);
185
- if(slave == undefined){
186
- return Promise.reject(id);
187
- }
188
- else if(slave.isReady){
189
- return Promise.resolve(id);
190
- }
191
- else{
192
- return self.netClient.Connect(slave);
193
- }
194
- }
195
- else{
196
- let promiseList = [];
197
- this.slaveList.forEach(function(slave, key){
198
- let promise;
199
- promise = self.netClient.Connect(slave);
200
- promiseList.push(promise);
201
- })
202
- successPromise = Promise.all(promiseList);
203
-
204
- return successPromise;
205
- }
206
-
207
- }
208
- /**
209
- *disconnect from server
210
- */
211
- Stop(id){
212
- if(id){
213
- let slave = this.slaveList.get(id);
214
- if(slave.isReady){
215
- return this.netClient.Disconnet(id);
216
- }
217
- else{
218
- return Promise.resolve(id);
219
- }
220
- }
221
- else{
222
- let promiseList = [];
223
- this.slaveList.forEach(function(slave, key){
224
- let promise;
225
- promise = this.netClient.Disconnet(id);
226
- promiseList.push(promise);
227
- })
228
- successPromise = Promise.all(promiseList);
229
- return successPromise;
230
- }
231
- }
232
- }
233
-
234
- module.exports = ModbusTCPClient;
@@ -1,173 +0,0 @@
1
- /**
2
- * Tcp Client module.
3
- * @module net/tcpclient.
4
- * @author Hector E. Socarras.
5
- * @version 0.8.0
6
- */
7
-
8
- const net = require('net');
9
-
10
- /**
11
- * Class representing a tcp client.
12
- */
13
- class TcpClient {
14
- /**
15
- * Create a tcp client.
16
- */
17
- constructor(){
18
-
19
- /**
20
- *net.socket Object
21
- * @type {object}
22
- */
23
- this.sockets = new Map();
24
-
25
- /**
26
- * prevent than server close de connection for idle time
27
- * @type {bool}
28
- */
29
- this.keepAliveConnection = false;
30
-
31
- //Funcion a ejecutar cuandose reciven datos
32
- this.onData = function(data){console.log(data)};
33
-
34
- //Funcion a ejecutar cuando se establece la coneccion
35
- this.onConnect = function(){console.log('connection establish whit: ' + this.socket.remoteAddress)};
36
-
37
- this.onError = function(err){ console.log(err)};
38
-
39
- this.onEnd = function(){console.log('connection closed')};
40
-
41
- this.onTimeOut = function(){console.log('timeout')};
42
-
43
- this.onClose = function(had_error){
44
- if(had_error){
45
- console.log('closed by error conexion')
46
- }
47
- else{
48
- console.log('closed');
49
- }
50
- }
51
-
52
- /**
53
- * function to executed when event write is emited
54
- * @param {Buffer} buff
55
- */
56
- this.onWrite = null
57
-
58
- }
59
-
60
- isConnected(id){
61
- return this.sockets.has(id);
62
- }
63
-
64
- Connect(Slave){
65
- let self = this;
66
- let promise = new Promise(function(resolve, reject){
67
- try{
68
- var conn = net.createConnection(Slave.port,Slave.ipAddress);
69
-
70
- //add Slave id to socket object
71
- conn.slaveID = Slave.id;
72
- Object.defineProperty(conn, 'slaveID', {
73
- writable: false,
74
- enumerable: false,
75
- configurable: false
76
- } )
77
- //add Slave timeout to socket
78
- conn.slaveTimeout = Slave.timeout;
79
-
80
- //configurando el socket devuelto
81
- conn.once('connect',function(){
82
- resolve(conn.slaveID)
83
- })
84
-
85
- conn.on('connect',function(){
86
- self.sockets.set(Slave.id, conn);
87
- self.onConnect(conn.slaveID);
88
- });
89
-
90
-
91
- conn.on('data', function(data){
92
- conn.setTimeout(0);
93
- self.onData(conn.slaveID, data);
94
- });
95
-
96
- conn.on('error', function(err){
97
- self.onError(conn.slaveID, err)
98
- })
99
-
100
- conn.once('error', function(err){
101
- if(self.sockets.has(conn.slaveID)){
102
- return
103
- }
104
- else{
105
- reject(conn.slaveID);
106
- }
107
- })
108
-
109
- conn.on('timeout', function(){
110
- conn.setTimeout(0);
111
- self.onTimeOut(conn.slaveID);
112
- })
113
-
114
- conn.on('end', function(){
115
- conn.end();
116
- self.onEnd(conn.slaveID);
117
- });
118
-
119
- conn.on('close',function(had_error){
120
- let key = conn.slaveID;
121
- self.sockets.delete(key);
122
- self.onClose(conn.slaveID, had_error);
123
- });
124
-
125
- }
126
- catch(e){
127
- self.onError(e);
128
- reject(conn.slaveID);
129
- }
130
- })
131
-
132
- return promise;
133
- }
134
-
135
- Disconnet(id){
136
- let self = this;
137
- if(this.sockets.has(id) == false){
138
- return Promise.resolve(id);
139
- }
140
- else{
141
- let promise = new Promise(function(resolve, reject){
142
- let socket = self.sockets.get(id);
143
- socket.destroy();
144
- self.sockets.delete(id);
145
- resolve(id)
146
- })
147
- return promise;
148
- }
149
- }
150
-
151
- Write(id, data){
152
- let self = this;
153
- if(this.sockets.has(id) == false){
154
- return false;
155
- }
156
- else{
157
- let isSuccesfull
158
- let socket = this.sockets.get(id);
159
- isSuccesfull = socket.write(data, 'utf8', function(){
160
- if(self.onWrite){
161
- self.onWrite(id, data);
162
- }
163
- });
164
- if(isSuccesfull){
165
- socket.setTimeout(socket.slaveTimeout);
166
- }
167
-
168
- return isSuccesfull;
169
- }
170
- }
171
- }
172
-
173
- module.exports = TcpClient