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,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;
|
package/src/net/tcpclient.js
DELETED
|
@@ -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
|