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
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
const Nodbus = require('../src/nodbus-plus');
|
|
2
|
+
|
|
3
|
+
//creating config file for basic server 1
|
|
4
|
+
let serverCfg = {
|
|
5
|
+
inputs : 524,
|
|
6
|
+
coils : 0,
|
|
7
|
+
holdingRegisters : 512,
|
|
8
|
+
inputRegisters : 256,
|
|
9
|
+
udpType : 'udp6',
|
|
10
|
+
port : 520
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
//creating config file for basic server 1
|
|
14
|
+
let serverCfg2 = {
|
|
15
|
+
transmitionMode : 1,
|
|
16
|
+
inputs : 524,
|
|
17
|
+
coils : 0,
|
|
18
|
+
holdingRegisters : 512,
|
|
19
|
+
inputRegisters : 256,
|
|
20
|
+
udpType : 'udp4',
|
|
21
|
+
port : 522
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
describe("rtu client", () => {
|
|
25
|
+
|
|
26
|
+
let server1 = Nodbus.createSerialServer('tcp', serverCfg);
|
|
27
|
+
|
|
28
|
+
let client = Nodbus.createSerialClient();
|
|
29
|
+
client.addChannel('server1', 'tcp1', {ip:'127.0.0.1', port: 520})
|
|
30
|
+
expect(client.isChannelReady('server1')).toEqual(false);
|
|
31
|
+
|
|
32
|
+
test("functions", (done) => {
|
|
33
|
+
|
|
34
|
+
expect(server1.isListening).toEqual(false);
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
client.on('transaction', (req, res) =>{
|
|
39
|
+
let reqAddress = req[0];
|
|
40
|
+
let resAddress = res[0];
|
|
41
|
+
let functionCode = req[1];
|
|
42
|
+
let valBuffer = Buffer.alloc(2);
|
|
43
|
+
|
|
44
|
+
expect(reqAddress).toEqual(resAddress)
|
|
45
|
+
expect(resAddress).toEqual(1)
|
|
46
|
+
|
|
47
|
+
switch(functionCode){
|
|
48
|
+
case 0x01:
|
|
49
|
+
expect(res.length).toEqual(6)
|
|
50
|
+
client.readInputs('server1', 1, 0, 2);
|
|
51
|
+
break;
|
|
52
|
+
case 0x02:
|
|
53
|
+
expect(res.length).toEqual(6)
|
|
54
|
+
client.readHoldingRegisters('server1', 1, 0, 2);
|
|
55
|
+
break
|
|
56
|
+
case 0x03:
|
|
57
|
+
expect(res.length).toEqual(9)
|
|
58
|
+
client.readInputRegisters('server1', 1, 0, 2);
|
|
59
|
+
break
|
|
60
|
+
case 0x04:
|
|
61
|
+
expect(res.length).toEqual(9)
|
|
62
|
+
client.forceSingleCoil(true, 'server1', 1, 5);
|
|
63
|
+
break;
|
|
64
|
+
case 0x05:
|
|
65
|
+
expect(res.length).toEqual(8)
|
|
66
|
+
expect(res[4]).toEqual(0xFF);
|
|
67
|
+
valBuffer[1] = 0x45;
|
|
68
|
+
client.presetSingleRegister(valBuffer, 'server1', 1, 10);
|
|
69
|
+
break;
|
|
70
|
+
case 0x06:
|
|
71
|
+
expect(res.length).toEqual(8)
|
|
72
|
+
expect(res[3]).toEqual(10);
|
|
73
|
+
expect(res[5]).toEqual(0x45);
|
|
74
|
+
let coils = [1, 1, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0];
|
|
75
|
+
client.forceMultipleCoils(coils, 'server1', 1, 12);
|
|
76
|
+
break
|
|
77
|
+
case 0x0f:
|
|
78
|
+
expect(res.length).toEqual(8)
|
|
79
|
+
expect(res[5]).toEqual(12);
|
|
80
|
+
valBuffer = Buffer.alloc(5);
|
|
81
|
+
let tempRegister = Buffer.alloc(2);
|
|
82
|
+
tempRegister.writeUint16BE(123);
|
|
83
|
+
client.setWordToBuffer(tempRegister, valBuffer, 0);
|
|
84
|
+
tempRegister.writeUint16BE(1234);
|
|
85
|
+
client.setWordToBuffer(tempRegister, valBuffer, 1);
|
|
86
|
+
client.presetMultiplesRegisters(valBuffer, 'server1', 1, 20);
|
|
87
|
+
break;
|
|
88
|
+
case 0x10:
|
|
89
|
+
expect(res.length).toEqual(8)
|
|
90
|
+
expect(res[5]).toEqual(2);
|
|
91
|
+
registerMask = [1, 0, 2, 0, 0, 1, 1, 1, 2, 2, 2, 0, 1, 2, 2, 1];
|
|
92
|
+
client.maskHoldingRegister(registerMask, 'server1', 1, 22);
|
|
93
|
+
break;
|
|
94
|
+
case 0x16:
|
|
95
|
+
expect(res.length).toEqual(10)
|
|
96
|
+
expect(res[3]).toEqual(req[3]);
|
|
97
|
+
expect(res[5]).toEqual(req[5]);
|
|
98
|
+
expect(res[7]).toEqual(req[7]);
|
|
99
|
+
client.readWriteMultiplesRegisters(valBuffer, 'server1', 1, 10, 3, 20);
|
|
100
|
+
break
|
|
101
|
+
case 0x17:
|
|
102
|
+
expect(res.length).toEqual(11)
|
|
103
|
+
expect(res[2]).toEqual(6);
|
|
104
|
+
client.presetSingleRegister(valBuffer, 'server1', 0, 10);
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
client.disconnect('server1');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
client.on('broadcast-timeout', () =>{
|
|
114
|
+
//console.log('broadcast timeout')
|
|
115
|
+
client.disconnect('server1');
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
client.on('connection-closed', ()=>{
|
|
119
|
+
//console.log('stopping server')
|
|
120
|
+
server1.stop()
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
client.on('connection', (id)=>{
|
|
124
|
+
//console.log('client connected')
|
|
125
|
+
let channel = client.channels.get(id);
|
|
126
|
+
expect(id).toEqual('server1');
|
|
127
|
+
expect(channel.ip).toEqual('127.0.0.1');
|
|
128
|
+
expect(channel.port).toEqual(520);
|
|
129
|
+
expect(client.isChannelReady(id)).toEqual(true);
|
|
130
|
+
|
|
131
|
+
client.readCoils('server1', 1, 0, 2);
|
|
132
|
+
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
server1.on('listening', (port)=>{
|
|
136
|
+
//console.log('server listenning')
|
|
137
|
+
let connectPromise = client.connect('server1');
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
server1.on('connection-closed', (has_error) => {
|
|
141
|
+
// console.log('client disconnected')
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
server1.on('closed', ()=>{
|
|
145
|
+
expect(server1.isListening).toEqual(false);
|
|
146
|
+
done()
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
server1.on('connection', (sock)=>{
|
|
150
|
+
//console.log('server say connection')
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
server1.on('data', (sock, data) => {
|
|
154
|
+
//console.log(data)
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
server1.start();
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe("ascii client", () => {
|
|
167
|
+
|
|
168
|
+
let server2 = Nodbus.createSerialServer('tcp', serverCfg2);
|
|
169
|
+
|
|
170
|
+
let client = Nodbus.createSerialClient();
|
|
171
|
+
client.addChannel('server2', 'tcp1', {ip:'127.0.0.1', port: 522})
|
|
172
|
+
expect(client.isChannelReady('server2')).toEqual(false);
|
|
173
|
+
|
|
174
|
+
test("functions", (done) => {
|
|
175
|
+
|
|
176
|
+
expect(server2.isListening).toEqual(false);
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
client.on('transaction', (req, res) =>{
|
|
181
|
+
let reqAddress = req[0];
|
|
182
|
+
let resAddress = res[0];
|
|
183
|
+
let functionCode = req[1];
|
|
184
|
+
let valBuffer = Buffer.alloc(2);
|
|
185
|
+
|
|
186
|
+
expect(reqAddress).toEqual(resAddress)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
switch(functionCode){
|
|
190
|
+
case 0x01:
|
|
191
|
+
expect(res.length).toEqual(6)
|
|
192
|
+
client.readInputs('server2', 1, 0, 2, true);
|
|
193
|
+
break;
|
|
194
|
+
case 0x02:
|
|
195
|
+
expect(res.length).toEqual(6)
|
|
196
|
+
client.readHoldingRegisters('server2', 1, 0, 2, true);
|
|
197
|
+
break
|
|
198
|
+
case 0x03:
|
|
199
|
+
expect(res.length).toEqual(9)
|
|
200
|
+
client.readInputRegisters('server2', 1, 0, 2, true);
|
|
201
|
+
break
|
|
202
|
+
case 0x04:
|
|
203
|
+
expect(res.length).toEqual(9)
|
|
204
|
+
client.forceSingleCoil(true, 'server2', 1, 5, true);
|
|
205
|
+
break;
|
|
206
|
+
case 0x05:
|
|
207
|
+
expect(res.length).toEqual(8)
|
|
208
|
+
expect(res[4]).toEqual(0xFF);
|
|
209
|
+
valBuffer[1] = 0x45;
|
|
210
|
+
client.presetSingleRegister(valBuffer, 'server2', 1, 10, true);
|
|
211
|
+
break;
|
|
212
|
+
case 0x06:
|
|
213
|
+
expect(res.length).toEqual(8)
|
|
214
|
+
expect(res[3]).toEqual(10);
|
|
215
|
+
expect(res[5]).toEqual(0x45);
|
|
216
|
+
let coils = [1, 1, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0];
|
|
217
|
+
client.forceMultipleCoils(coils, 'server2', 1, 12, true);
|
|
218
|
+
break
|
|
219
|
+
case 0x0f:
|
|
220
|
+
expect(res.length).toEqual(8)
|
|
221
|
+
expect(res[5]).toEqual(12);
|
|
222
|
+
valBuffer = Buffer.alloc(5);
|
|
223
|
+
let tempRegister = Buffer.alloc(2);
|
|
224
|
+
tempRegister.writeUint16BE(123);
|
|
225
|
+
client.setWordToBuffer(tempRegister, valBuffer, 0);
|
|
226
|
+
tempRegister.writeUint16BE(1234);
|
|
227
|
+
client.setWordToBuffer(tempRegister, valBuffer, 1);
|
|
228
|
+
client.presetMultiplesRegisters(valBuffer, 'server2', 1, 20, true);
|
|
229
|
+
break;
|
|
230
|
+
case 0x10:
|
|
231
|
+
expect(res.length).toEqual(8)
|
|
232
|
+
expect(res[5]).toEqual(2);
|
|
233
|
+
registerMask = [1, 0, 2, 0, 0, 1, 1, 1, 2, 2, 2, 0, 1, 2, 2, 1];
|
|
234
|
+
client.maskHoldingRegister(registerMask, 'server2', 1, 22, true);
|
|
235
|
+
break;
|
|
236
|
+
case 0x16:
|
|
237
|
+
expect(res.length).toEqual(10)
|
|
238
|
+
expect(res[3]).toEqual(req[3]);
|
|
239
|
+
expect(res[5]).toEqual(req[5]);
|
|
240
|
+
expect(res[7]).toEqual(req[7]);
|
|
241
|
+
client.readWriteMultiplesRegisters(valBuffer, 'server2', 1, 10, 3, 20, true);
|
|
242
|
+
break
|
|
243
|
+
case 0x17:
|
|
244
|
+
expect(res.length).toEqual(11)
|
|
245
|
+
expect(res[2]).toEqual(6);
|
|
246
|
+
client.disconnect('server2');
|
|
247
|
+
break;
|
|
248
|
+
default:
|
|
249
|
+
client.disconnect('server2');
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
client.on('connection-closed', ()=>{
|
|
256
|
+
//console.log('stopping server')
|
|
257
|
+
server2.stop()
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
client.on('connection', (id)=>{
|
|
261
|
+
//console.log('client connected')
|
|
262
|
+
let channel = client.channels.get(id);
|
|
263
|
+
expect(id).toEqual('server2');
|
|
264
|
+
expect(channel.ip).toEqual('127.0.0.1');
|
|
265
|
+
expect(channel.port).toEqual(522);
|
|
266
|
+
expect(client.isChannelReady(id)).toEqual(true);
|
|
267
|
+
|
|
268
|
+
client.readCoils('server2', 1, 0, 2, true);
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
server2.on('listening', (port)=>{
|
|
274
|
+
//console.log('server listenning')
|
|
275
|
+
let connectPromise = client.connect('server2');
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
server2.on('connection-closed', (has_error) => {
|
|
279
|
+
// console.log('client disconnected')
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
server2.on('closed', ()=>{
|
|
283
|
+
expect(server2.isListening).toEqual(false);
|
|
284
|
+
done()
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
server2.on('connection', (sock)=>{
|
|
288
|
+
//console.log('server say connection')
|
|
289
|
+
})
|
|
290
|
+
|
|
291
|
+
server2.on('data', (sock, data) => {
|
|
292
|
+
// console.log(data)
|
|
293
|
+
})
|
|
294
|
+
|
|
295
|
+
server2.on('write', (sock, data)=>{
|
|
296
|
+
// console.log(data)
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
server2.start();
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
});
|
|
307
|
+
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
|
|
2
|
+
const Nodbus = require('../src/nodbus-plus');
|
|
3
|
+
|
|
4
|
+
//creating config file for basic server 1
|
|
5
|
+
let serverCfg = {
|
|
6
|
+
inputs : 524,
|
|
7
|
+
coils : 0,
|
|
8
|
+
holdingRegisters : 512,
|
|
9
|
+
inputRegisters : 256,
|
|
10
|
+
udpType : 'udp6',
|
|
11
|
+
port : 510
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
//creating config file for basic server 1
|
|
15
|
+
let serverCfg2 = {
|
|
16
|
+
inputs : 524,
|
|
17
|
+
coils : 0,
|
|
18
|
+
holdingRegisters : 512,
|
|
19
|
+
inputRegisters : 256,
|
|
20
|
+
udpType : 'udp4',
|
|
21
|
+
port : 512
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
describe("tcp client", () => {
|
|
25
|
+
|
|
26
|
+
let server1 = Nodbus.createTcpServer('tcp', serverCfg);
|
|
27
|
+
|
|
28
|
+
let client = Nodbus.createTcpClient();
|
|
29
|
+
client.addChannel('server1', 'tcp1', {ip:'127.0.0.1', port: 510})
|
|
30
|
+
expect(client.isChannelReady('server1')).toEqual(false);
|
|
31
|
+
|
|
32
|
+
test("functions", (done) => {
|
|
33
|
+
|
|
34
|
+
expect(server1.isListening).toEqual(false);
|
|
35
|
+
|
|
36
|
+
let tCounter = 0; //used to count response.
|
|
37
|
+
|
|
38
|
+
client.on('transaction', (req, res) =>{
|
|
39
|
+
let reqId = req.readUInt16BE(0);
|
|
40
|
+
let resId = res.readUInt16BE(0);
|
|
41
|
+
let unitId = req[6]
|
|
42
|
+
let functionCode = req[7];
|
|
43
|
+
|
|
44
|
+
expect(reqId).toEqual(resId)
|
|
45
|
+
expect(unitId).toEqual(255)
|
|
46
|
+
|
|
47
|
+
switch(functionCode){
|
|
48
|
+
case 0x01:
|
|
49
|
+
expect(res.length).toEqual(10)
|
|
50
|
+
tCounter++;
|
|
51
|
+
break;
|
|
52
|
+
case 0x02:
|
|
53
|
+
expect(res.length).toEqual(10)
|
|
54
|
+
tCounter++;
|
|
55
|
+
break
|
|
56
|
+
case 0x03:
|
|
57
|
+
expect(res.length).toEqual(13)
|
|
58
|
+
tCounter++;
|
|
59
|
+
break
|
|
60
|
+
case 0x04:
|
|
61
|
+
expect(res.length).toEqual(13)
|
|
62
|
+
tCounter++;
|
|
63
|
+
break;
|
|
64
|
+
case 0x05:
|
|
65
|
+
expect(res.length).toEqual(12)
|
|
66
|
+
expect(res[10]).toEqual(0xFF);
|
|
67
|
+
tCounter++;
|
|
68
|
+
break;
|
|
69
|
+
case 0x06:
|
|
70
|
+
expect(res.length).toEqual(12)
|
|
71
|
+
expect(res[9]).toEqual(10);
|
|
72
|
+
expect(res[11]).toEqual(0x45);
|
|
73
|
+
tCounter++;
|
|
74
|
+
break
|
|
75
|
+
case 0x0f:
|
|
76
|
+
expect(res.length).toEqual(12)
|
|
77
|
+
expect(res[11]).toEqual(12);
|
|
78
|
+
tCounter++;
|
|
79
|
+
break;
|
|
80
|
+
case 0x10:
|
|
81
|
+
expect(res.length).toEqual(12)
|
|
82
|
+
expect(res[11]).toEqual(2);
|
|
83
|
+
tCounter++;
|
|
84
|
+
break;
|
|
85
|
+
case 0x16:
|
|
86
|
+
expect(res.length).toEqual(14)
|
|
87
|
+
expect(res[9]).toEqual(req[9]);
|
|
88
|
+
expect(res[11]).toEqual(req[11]);
|
|
89
|
+
expect(res[13]).toEqual(req[13]);
|
|
90
|
+
tCounter++;
|
|
91
|
+
break
|
|
92
|
+
case 0x17:
|
|
93
|
+
expect(res.length).toEqual(15)
|
|
94
|
+
expect(res[8]).toEqual(6);
|
|
95
|
+
tCounter++;
|
|
96
|
+
expect(tCounter).toEqual(10);
|
|
97
|
+
client.disconnect('server1');
|
|
98
|
+
break;
|
|
99
|
+
default:
|
|
100
|
+
client.disconnect('server1');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
client.on('connection-closed', ()=>{
|
|
107
|
+
//console.log('stopping server')
|
|
108
|
+
server1.stop()
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
client.on('connection', (id)=>{
|
|
112
|
+
//console.log('client connected')
|
|
113
|
+
let channel = client.channels.get(id);
|
|
114
|
+
expect(id).toEqual('server1');
|
|
115
|
+
expect(channel.ip).toEqual('127.0.0.1');
|
|
116
|
+
expect(channel.port).toEqual(510);
|
|
117
|
+
expect(client.isChannelReady(id)).toEqual(true);
|
|
118
|
+
|
|
119
|
+
client.readCoils('server1', 255, 0, 2);
|
|
120
|
+
client.readInputs('server1', 255, 0, 2);
|
|
121
|
+
client.readHoldingRegisters('server1', 255, 0, 2);
|
|
122
|
+
client.readInputRegisters('server1', 255, 0, 2);
|
|
123
|
+
client.forceSingleCoil(true, 'server1', 255, 5);
|
|
124
|
+
let valBuffer = Buffer.alloc(2);
|
|
125
|
+
valBuffer[1] = 0x45;
|
|
126
|
+
client.presetSingleRegister(valBuffer, 'server1', 255, 10);
|
|
127
|
+
let coils = [1, 1, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0];
|
|
128
|
+
client.forceMultipleCoils(coils, 'server1', 255, 12);
|
|
129
|
+
valBuffer = Buffer.alloc(5);
|
|
130
|
+
let tempRegister = Buffer.alloc(2);
|
|
131
|
+
tempRegister.writeUint16BE(123);
|
|
132
|
+
client.setWordToBuffer(tempRegister, valBuffer, 0);
|
|
133
|
+
tempRegister.writeUint16BE(1234);
|
|
134
|
+
client.setWordToBuffer(tempRegister, valBuffer, 1);
|
|
135
|
+
client.presetMultiplesRegisters(valBuffer, 'server1', 255, 20);
|
|
136
|
+
registerMask = [1, 0, 2, 0, 0, 1, 1, 1, 2, 2, 2, 0, 1, 2, 2, 1];
|
|
137
|
+
client.maskHoldingRegister(registerMask, 'server1', 255, 22);
|
|
138
|
+
client.readWriteMultiplesRegisters(valBuffer, 'server1', 255, 10, 3, 20);
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
server1.on('listening', (port)=>{
|
|
145
|
+
//console.log('server listenning')
|
|
146
|
+
let connectPromise = client.connect('server1');
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
server1.on('connection-closed', (has_error) => {
|
|
150
|
+
// console.log('client disconnected')
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
server1.on('closed', ()=>{
|
|
154
|
+
expect(server1.isListening).toEqual(false);
|
|
155
|
+
done()
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
server1.on('connection', (sock)=>{
|
|
159
|
+
//console.log('server say connection')
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
server1.on('data', (sock, data) => {
|
|
163
|
+
//console.log(data)
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
server1.start();
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe("udp client", () => {
|
|
176
|
+
|
|
177
|
+
let server2 = Nodbus.createTcpServer('udp4', serverCfg2);
|
|
178
|
+
|
|
179
|
+
let client2 = Nodbus.createTcpClient();
|
|
180
|
+
|
|
181
|
+
client2.addChannel('server2', 'udp1', {ip:'127.0.0.1', port: 512, udpType:'udp4',})
|
|
182
|
+
|
|
183
|
+
expect(client2.isChannelReady('server2')).toEqual(false);
|
|
184
|
+
|
|
185
|
+
test("functions", (done) => {
|
|
186
|
+
|
|
187
|
+
expect(server2.isListening).toEqual(false);
|
|
188
|
+
|
|
189
|
+
let tCounter = 0; //used to count response.
|
|
190
|
+
|
|
191
|
+
client2.on('transaction', (req, res) =>{
|
|
192
|
+
let reqId = req.readUInt16BE(0);
|
|
193
|
+
let resId = res.readUInt16BE(0);
|
|
194
|
+
let unitId = req[6]
|
|
195
|
+
let functionCode = req[7];
|
|
196
|
+
|
|
197
|
+
expect(reqId).toEqual(resId)
|
|
198
|
+
expect(unitId).toEqual(255)
|
|
199
|
+
|
|
200
|
+
switch(functionCode){
|
|
201
|
+
case 0x01:
|
|
202
|
+
expect(res.length).toEqual(10)
|
|
203
|
+
tCounter++;
|
|
204
|
+
break;
|
|
205
|
+
case 0x02:
|
|
206
|
+
expect(res.length).toEqual(10)
|
|
207
|
+
tCounter++;
|
|
208
|
+
break
|
|
209
|
+
case 0x03:
|
|
210
|
+
expect(res.length).toEqual(13)
|
|
211
|
+
tCounter++;
|
|
212
|
+
break
|
|
213
|
+
case 0x04:
|
|
214
|
+
expect(res.length).toEqual(13)
|
|
215
|
+
tCounter++;
|
|
216
|
+
break;
|
|
217
|
+
case 0x05:
|
|
218
|
+
expect(res.length).toEqual(12)
|
|
219
|
+
expect(res[10]).toEqual(0xFF);
|
|
220
|
+
tCounter++;
|
|
221
|
+
break;
|
|
222
|
+
case 0x06:
|
|
223
|
+
expect(res.length).toEqual(12)
|
|
224
|
+
expect(res[9]).toEqual(10);
|
|
225
|
+
expect(res[11]).toEqual(0x45);
|
|
226
|
+
tCounter++;
|
|
227
|
+
break
|
|
228
|
+
case 0x0f:
|
|
229
|
+
expect(res.length).toEqual(12)
|
|
230
|
+
expect(res[11]).toEqual(12);
|
|
231
|
+
tCounter++;
|
|
232
|
+
break;
|
|
233
|
+
case 0x10:
|
|
234
|
+
expect(res.length).toEqual(12)
|
|
235
|
+
expect(res[11]).toEqual(2);
|
|
236
|
+
tCounter++;
|
|
237
|
+
break;
|
|
238
|
+
case 0x16:
|
|
239
|
+
expect(res.length).toEqual(14)
|
|
240
|
+
expect(res[9]).toEqual(req[9]);
|
|
241
|
+
expect(res[11]).toEqual(req[11]);
|
|
242
|
+
expect(res[13]).toEqual(req[13]);
|
|
243
|
+
tCounter++;
|
|
244
|
+
break
|
|
245
|
+
case 0x17:
|
|
246
|
+
expect(res.length).toEqual(15)
|
|
247
|
+
expect(res[8]).toEqual(6);
|
|
248
|
+
tCounter++;
|
|
249
|
+
expect(tCounter).toEqual(10);
|
|
250
|
+
client2.disconnect('server2');
|
|
251
|
+
break;
|
|
252
|
+
default:
|
|
253
|
+
client2.disconnect('server2');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
client2.on('connection-closed', ()=>{
|
|
260
|
+
//console.log('stopping server')
|
|
261
|
+
server2.stop()
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
client2.on('connection', (id)=>{
|
|
265
|
+
//console.log('client connected')
|
|
266
|
+
let channel = client2.channels.get(id);
|
|
267
|
+
expect(id).toEqual('server2');
|
|
268
|
+
expect(channel.ip).toEqual('127.0.0.1');
|
|
269
|
+
expect(channel.port).toEqual(512);
|
|
270
|
+
expect(client2.isChannelReady(id)).toEqual(true);
|
|
271
|
+
client2.readCoils('server2', 255, 0, 2);
|
|
272
|
+
client2.readInputs('server2', 255, 0, 2);
|
|
273
|
+
client2.readHoldingRegisters('server2', 255, 0, 2);
|
|
274
|
+
client2.readInputRegisters('server2', 255, 0, 2);
|
|
275
|
+
client2.forceSingleCoil(true, 'server2', 255, 5);
|
|
276
|
+
let valBuffer = Buffer.alloc(2);
|
|
277
|
+
valBuffer[1] = 0x45;
|
|
278
|
+
client2.presetSingleRegister(valBuffer, 'server2', 255, 10);
|
|
279
|
+
let coils = [1, 1, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0];
|
|
280
|
+
client2.forceMultipleCoils(coils, 'server2', 255, 12);
|
|
281
|
+
valBuffer = Buffer.alloc(5);
|
|
282
|
+
let tempRegister = Buffer.alloc(2);
|
|
283
|
+
tempRegister.writeUint16BE(123);
|
|
284
|
+
client2.setWordToBuffer(tempRegister, valBuffer, 0);
|
|
285
|
+
tempRegister.writeUint16BE(1234);
|
|
286
|
+
client2.setWordToBuffer(tempRegister, valBuffer, 1);
|
|
287
|
+
client2.presetMultiplesRegisters(valBuffer, 'server2', 255, 20);
|
|
288
|
+
registerMask = [1, 0, 2, 0, 0, 1, 1, 1, 2, 2, 2, 0, 1, 2, 2, 1];
|
|
289
|
+
client2.maskHoldingRegister(registerMask, 'server2', 255, 22);
|
|
290
|
+
client2.readWriteMultiplesRegisters(valBuffer, 'server2', 255, 10, 3, 20);
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
})
|
|
294
|
+
|
|
295
|
+
client2.on('write', (id, req) =>{
|
|
296
|
+
//console.log(req)
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
server2.on('listening', (port)=>{
|
|
300
|
+
//console.log('server listenning')
|
|
301
|
+
client2.connect('server2');
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
server2.on('connection-closed', (has_error) => {
|
|
305
|
+
// console.log('client disconnected')
|
|
306
|
+
})
|
|
307
|
+
|
|
308
|
+
server2.on('closed', ()=>{
|
|
309
|
+
//console.log('server closed')
|
|
310
|
+
expect(server2.isListening).toEqual(false);
|
|
311
|
+
let channel = client2.channels.get('server2');
|
|
312
|
+
channel.coreChannel.close();
|
|
313
|
+
setTimeout(()=>{
|
|
314
|
+
done();
|
|
315
|
+
}, 250)
|
|
316
|
+
|
|
317
|
+
})
|
|
318
|
+
|
|
319
|
+
server2.on('connection', (sock)=>{
|
|
320
|
+
//console.log('server say connection')
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
server2.on('data', (sock, data) => {
|
|
324
|
+
//console.log(data)
|
|
325
|
+
})
|
|
326
|
+
|
|
327
|
+
server2.start();
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
});
|