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,279 @@
|
|
|
1
|
+
const ModbusClient = require('../').ModbusClient
|
|
2
|
+
|
|
3
|
+
describe("Read Coils status", () => {
|
|
4
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
5
|
+
let pdu2 = Buffer.from([0x01, 0x00, 0x48, 0x00, 0x0A]);
|
|
6
|
+
|
|
7
|
+
let testMaster = new ModbusClient();
|
|
8
|
+
|
|
9
|
+
it("request 1", () => {
|
|
10
|
+
let req1 = testMaster.readCoilStatusPdu(0, 3);
|
|
11
|
+
expect(req1[0]).toEqual(1);
|
|
12
|
+
expect(req1[1]).toEqual(0);
|
|
13
|
+
expect(req1[4]).toEqual(3);
|
|
14
|
+
expect(req1.length).toEqual(5);
|
|
15
|
+
} );
|
|
16
|
+
it("request 2", () => {
|
|
17
|
+
let req2 = testMaster.readCoilStatusPdu(0x48, 10);
|
|
18
|
+
expect(req2[0]).toEqual(1);
|
|
19
|
+
expect(req2[2]).toEqual(0x48);
|
|
20
|
+
expect(req2[4]).toEqual(10);
|
|
21
|
+
expect(req2.length).toEqual(5);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("Read Input status", () => {
|
|
27
|
+
|
|
28
|
+
let testMaster = new ModbusClient();
|
|
29
|
+
|
|
30
|
+
it("request 1", () => {
|
|
31
|
+
let req1 = testMaster.readInputStatusPdu(0, 3);
|
|
32
|
+
expect(req1[0]).toEqual(2);
|
|
33
|
+
expect(req1[1]).toEqual(0);
|
|
34
|
+
expect(req1[4]).toEqual(3);
|
|
35
|
+
expect(req1.length).toEqual(5);
|
|
36
|
+
} );
|
|
37
|
+
it("request 2", () => {
|
|
38
|
+
let req2 = testMaster.readInputStatusPdu(0x48, 10);
|
|
39
|
+
expect(req2[0]).toEqual(2);
|
|
40
|
+
expect(req2[2]).toEqual(0x48);
|
|
41
|
+
expect(req2[4]).toEqual(10);
|
|
42
|
+
expect(req2.length).toEqual(5);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe("Read Holding register status", () => {
|
|
48
|
+
|
|
49
|
+
let testMaster = new ModbusClient();
|
|
50
|
+
|
|
51
|
+
it("request 1", () => {
|
|
52
|
+
let req1 = testMaster.readHoldingRegistersPdu(0, 3);
|
|
53
|
+
expect(req1[0]).toEqual(3);
|
|
54
|
+
expect(req1[1]).toEqual(0);
|
|
55
|
+
expect(req1[4]).toEqual(3);
|
|
56
|
+
expect(req1.length).toEqual(5);
|
|
57
|
+
} );
|
|
58
|
+
it("request 2", () => {
|
|
59
|
+
let req2 = testMaster.readHoldingRegistersPdu(0x48, 10);
|
|
60
|
+
expect(req2[0]).toEqual(3);
|
|
61
|
+
expect(req2[2]).toEqual(0x48);
|
|
62
|
+
expect(req2[4]).toEqual(10);
|
|
63
|
+
expect(req2.length).toEqual(5);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe("Read Input register status", () => {
|
|
69
|
+
|
|
70
|
+
let testMaster = new ModbusClient();
|
|
71
|
+
|
|
72
|
+
it("request 1", () => {
|
|
73
|
+
let req1 = testMaster.readInputRegistersPdu(0, 3);
|
|
74
|
+
expect(req1[0]).toEqual(4);
|
|
75
|
+
expect(req1[1]).toEqual(0);
|
|
76
|
+
expect(req1[4]).toEqual(3);
|
|
77
|
+
expect(req1.length).toEqual(5);
|
|
78
|
+
} );
|
|
79
|
+
it("request 2", () => {
|
|
80
|
+
let req2 = testMaster.readInputRegistersPdu(0x48, 10);
|
|
81
|
+
expect(req2[0]).toEqual(4);
|
|
82
|
+
expect(req2[2]).toEqual(0x48);
|
|
83
|
+
expect(req2[4]).toEqual(10);
|
|
84
|
+
expect(req2.length).toEqual(5);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe("force single Coils", () => {
|
|
90
|
+
|
|
91
|
+
let testMaster = new ModbusClient();
|
|
92
|
+
|
|
93
|
+
it("request 1", () => {
|
|
94
|
+
let req1 = testMaster.forceSingleCoilPdu(testMaster.boolToBuffer(true), 3);
|
|
95
|
+
expect(req1[0]).toEqual(5);
|
|
96
|
+
expect(req1[2]).toEqual(3);
|
|
97
|
+
expect(req1[3]).toEqual(0xFF);
|
|
98
|
+
expect(req1.length).toEqual(5);
|
|
99
|
+
} );
|
|
100
|
+
it("request 2", () => {
|
|
101
|
+
let req2 = testMaster.forceSingleCoilPdu(testMaster.boolToBuffer(false), 10);
|
|
102
|
+
expect(req2[0]).toEqual(5);
|
|
103
|
+
expect(req2[2]).toEqual(10);
|
|
104
|
+
expect(req2[4]).toEqual(0);
|
|
105
|
+
expect(req2.length).toEqual(5);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe("Preset single register", () => {
|
|
111
|
+
|
|
112
|
+
let testMaster = new ModbusClient();
|
|
113
|
+
let val1 = Buffer.alloc(2);
|
|
114
|
+
val1[0] = 0x25;
|
|
115
|
+
val1[1] = 0x56;
|
|
116
|
+
it("request 1", () => {
|
|
117
|
+
let req1 = testMaster.presetSingleRegisterPdu(val1, 20);
|
|
118
|
+
expect(req1[0]).toEqual(6);
|
|
119
|
+
expect(req1[2]).toEqual(20);
|
|
120
|
+
expect(req1[4]).toEqual(0x56);
|
|
121
|
+
expect(req1.length).toEqual(5);
|
|
122
|
+
} );
|
|
123
|
+
it("request 2", () => {
|
|
124
|
+
let req2 = testMaster.presetSingleRegisterPdu(val1, 10);
|
|
125
|
+
expect(req2[0]).toEqual(6);
|
|
126
|
+
expect(req2[2]).toEqual(10);
|
|
127
|
+
expect(req2[3]).toEqual(0x25);
|
|
128
|
+
expect(req2.length).toEqual(5);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe("write multiple Coils", () => {
|
|
134
|
+
|
|
135
|
+
let testMaster = new ModbusClient();
|
|
136
|
+
let val1 = Buffer.alloc(1);
|
|
137
|
+
let val2 = Buffer.alloc(2);
|
|
138
|
+
val1[0] = 0x36;
|
|
139
|
+
val2[0] = 0x74;
|
|
140
|
+
val2[1] = 0x25;
|
|
141
|
+
|
|
142
|
+
test("bools to buffer", () => {
|
|
143
|
+
let valBuffer = testMaster.boolsToBuffer([0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1]);
|
|
144
|
+
expect(valBuffer.length).toEqual(2);
|
|
145
|
+
expect(valBuffer[0]).toEqual(0xC2);
|
|
146
|
+
expect(valBuffer[1]).toEqual(0x04);
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
it("request 1", () => {
|
|
150
|
+
let req1 = testMaster.forceMultipleCoilsPdu(val1, 3, 5);
|
|
151
|
+
expect(req1[0]).toEqual(15);
|
|
152
|
+
expect(req1[2]).toEqual(3);
|
|
153
|
+
expect(req1[4]).toEqual(5);
|
|
154
|
+
expect(req1[5]).toEqual(1);
|
|
155
|
+
expect(req1[6]).toEqual(0x36);
|
|
156
|
+
} );
|
|
157
|
+
|
|
158
|
+
it("request 2", () => {
|
|
159
|
+
let req2 = testMaster.forceMultipleCoilsPdu(val2, 10, 12);
|
|
160
|
+
expect(req2[0]).toEqual(15);
|
|
161
|
+
expect(req2[2]).toEqual(10);
|
|
162
|
+
expect(req2[4]).toEqual(12);
|
|
163
|
+
expect(req2[5]).toEqual(2);
|
|
164
|
+
expect(req2[7]).toEqual(0x25);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
describe("write multiple register", () => {
|
|
170
|
+
|
|
171
|
+
let testMaster = new ModbusClient();
|
|
172
|
+
let val1 = Buffer.alloc(4);
|
|
173
|
+
val1[0] = 0x25;
|
|
174
|
+
val1[1] = 0x56;
|
|
175
|
+
val1[2] = 0x46;
|
|
176
|
+
val1[3] = 0x63;
|
|
177
|
+
|
|
178
|
+
it("request 1", () => {
|
|
179
|
+
let req1 = testMaster.presetMultipleRegistersPdu(val1, 20);
|
|
180
|
+
expect(req1[0]).toEqual(16);
|
|
181
|
+
expect(req1[2]).toEqual(20);
|
|
182
|
+
expect(req1[4]).toEqual(2);
|
|
183
|
+
expect(req1[5]).toEqual(4);
|
|
184
|
+
expect(req1.length).toEqual(10);
|
|
185
|
+
} );
|
|
186
|
+
it("request 2", () => {
|
|
187
|
+
let req2 = testMaster.presetMultipleRegistersPdu(val1, 10, 3);
|
|
188
|
+
expect(req2[0]).toEqual(16);
|
|
189
|
+
expect(req2[2]).toEqual(10);
|
|
190
|
+
expect(req2[4]).toEqual(3);
|
|
191
|
+
expect(req2[5]).toEqual(6);
|
|
192
|
+
expect(req2.length).toEqual(12);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
describe("mask holding register", () => {
|
|
198
|
+
|
|
199
|
+
let testMaster = new ModbusClient();
|
|
200
|
+
let val1 = new Array(16);
|
|
201
|
+
val1[0] = -1;
|
|
202
|
+
val1[1] = 0;
|
|
203
|
+
val1[2] = 1;
|
|
204
|
+
val1[3] = -1;
|
|
205
|
+
val1[4] = -1;
|
|
206
|
+
val1[5] = -1;
|
|
207
|
+
val1[6] = 0;
|
|
208
|
+
val1[7] = 0;
|
|
209
|
+
val1[8] = 1;
|
|
210
|
+
val1[9] = -1;
|
|
211
|
+
val1[10] = -1;
|
|
212
|
+
val1[11] = -1;
|
|
213
|
+
val1[12] = -1;
|
|
214
|
+
val1[13] = -1;
|
|
215
|
+
val1[14] = 1;
|
|
216
|
+
val1[15] = 1;
|
|
217
|
+
|
|
218
|
+
maskBuffer = testMaster.getMaskRegisterBuffer(val1);
|
|
219
|
+
|
|
220
|
+
it("request 1", () => {
|
|
221
|
+
let req1 = testMaster.maskHoldingRegisterPdu(maskBuffer, 20);
|
|
222
|
+
expect(req1[0]).toEqual(22);
|
|
223
|
+
expect(req1[2]).toEqual(20);
|
|
224
|
+
expect(req1.length).toEqual(7);
|
|
225
|
+
} );
|
|
226
|
+
|
|
227
|
+
it("mask", () => {
|
|
228
|
+
//masks
|
|
229
|
+
let andMask = maskBuffer.readUInt16BE(0);
|
|
230
|
+
let orMask = maskBuffer.readUInt16BE(2);
|
|
231
|
+
let testRegister = Buffer.alloc(2)
|
|
232
|
+
testRegister[0] = 0x9A;
|
|
233
|
+
testRegister[1] = 0xFB;
|
|
234
|
+
let currentContent = testRegister.readUInt16BE(0);
|
|
235
|
+
let finalResult = (currentContent & andMask) | (orMask & (~andMask));
|
|
236
|
+
let finalBuffer = Buffer.alloc(2);
|
|
237
|
+
finalBuffer.writeUInt16BE(finalResult, 0);
|
|
238
|
+
expect(maskBuffer[0]).toEqual(0x3E);
|
|
239
|
+
expect(maskBuffer[1]).toEqual(0x39);
|
|
240
|
+
expect(maskBuffer[2]).toEqual(0xFF);
|
|
241
|
+
expect(maskBuffer[3]).toEqual(0x3D);
|
|
242
|
+
expect(finalResult).toEqual(0xDB3D);
|
|
243
|
+
expect(finalBuffer[0]).toEqual(0xDB);
|
|
244
|
+
expect(finalBuffer[1]).toEqual(0x3D);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
describe("read and write multiple register", () => {
|
|
250
|
+
|
|
251
|
+
let testMaster = new ModbusClient();
|
|
252
|
+
let val1 = Buffer.alloc(4);
|
|
253
|
+
val1[0] = 0x25;
|
|
254
|
+
val1[1] = 0x56;
|
|
255
|
+
val1[2] = 0x46;
|
|
256
|
+
val1[3] = 0x63;
|
|
257
|
+
|
|
258
|
+
it("request 1", () => {
|
|
259
|
+
let req1 = testMaster.readWriteMultipleRegistersPdu(val1, 20, 5, 100);
|
|
260
|
+
expect(req1[0]).toEqual(23);
|
|
261
|
+
expect(req1[2]).toEqual(20);
|
|
262
|
+
expect(req1[4]).toEqual(5);
|
|
263
|
+
expect(req1[6]).toEqual(100);
|
|
264
|
+
expect(req1[8]).toEqual(2);
|
|
265
|
+
expect(req1[9]).toEqual(4);
|
|
266
|
+
expect(req1.length).toEqual(14);
|
|
267
|
+
} );
|
|
268
|
+
it("request 2", () => {
|
|
269
|
+
let req2 = testMaster.readWriteMultipleRegistersPdu(val1, 10, 3, 20, 5);
|
|
270
|
+
expect(req2[0]).toEqual(23);
|
|
271
|
+
expect(req2[2]).toEqual(10);
|
|
272
|
+
expect(req2[4]).toEqual(3);
|
|
273
|
+
expect(req2[6]).toEqual(20);
|
|
274
|
+
expect(req2[8]).toEqual(5);
|
|
275
|
+
expect(req2[9]).toEqual(10);
|
|
276
|
+
expect(req2.length).toEqual(20);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
const ModbusSerialClient = require('../').ModbusSerialClient
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
describe("Make reqest Buffer", () => {
|
|
5
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
6
|
+
let pdu2 = [0x01, 0x00, 0x48, 0x00, 0x0A, 0x05];
|
|
7
|
+
|
|
8
|
+
let testMaster = new ModbusSerialClient();
|
|
9
|
+
|
|
10
|
+
it("fail to make request", () => {
|
|
11
|
+
|
|
12
|
+
req1 = testMaster.makeRequest(10, pdu2);
|
|
13
|
+
req2 = testMaster.makeRequest(258, pdu1);
|
|
14
|
+
expect(req1).toEqual(null);
|
|
15
|
+
expect(req2).toEqual(null);
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
} );
|
|
19
|
+
|
|
20
|
+
it("successful request", () => {
|
|
21
|
+
|
|
22
|
+
req1 = testMaster.makeRequest(2, pdu1);
|
|
23
|
+
expect(req1[0]).toEqual(2);
|
|
24
|
+
expect(req1[1]).toEqual(1);
|
|
25
|
+
expect(req1[3]).toEqual(0);
|
|
26
|
+
expect(req1[5]).toEqual(3);
|
|
27
|
+
expect(req1[6]).toEqual(0x7C);
|
|
28
|
+
expect(req1[7]).toEqual(0x38);
|
|
29
|
+
expect(req1.length).toEqual(8);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("successful request Ascii", () => {
|
|
33
|
+
|
|
34
|
+
req = testMaster.makeRequest(2, pdu1);
|
|
35
|
+
req1 = testMaster.aduRtuToAscii(req)
|
|
36
|
+
expect(req1[0]).toEqual(0x3A);
|
|
37
|
+
expect(req1[2]).toEqual(0x32);
|
|
38
|
+
expect(req1[4]).toEqual(0x31);
|
|
39
|
+
expect(req1[12]).toEqual(0x33);
|
|
40
|
+
expect(req1[13]).toEqual(0x46);
|
|
41
|
+
expect(req1[14]).toEqual(0x41);
|
|
42
|
+
expect(req1.length).toEqual(17);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
describe("setReqTimer", () => {
|
|
49
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
50
|
+
|
|
51
|
+
let testMaster = new ModbusSerialClient();
|
|
52
|
+
|
|
53
|
+
it("successful request", () => {
|
|
54
|
+
|
|
55
|
+
req1 = testMaster.makeRequest(2, pdu1);
|
|
56
|
+
|
|
57
|
+
let timed1 = testMaster.setReqTimer(1500);
|
|
58
|
+
expect(timed1).toEqual(-1);
|
|
59
|
+
|
|
60
|
+
testMaster.activeRequest = req1;
|
|
61
|
+
let timed3 = testMaster.setReqTimer(100);
|
|
62
|
+
let stored = testMaster.activeRequestTimerId;
|
|
63
|
+
expect(stored).toEqual(timed3);
|
|
64
|
+
|
|
65
|
+
testMaster.on('req-timeout', (req) =>{
|
|
66
|
+
expect(req[0]).toEqual(2);
|
|
67
|
+
expect(req[1]).toEqual(1);
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('calc crc', () => {
|
|
76
|
+
|
|
77
|
+
let adu1 = Buffer.from([0x02, 0x07, 0x00, 0x00]);
|
|
78
|
+
let adu2 = Buffer.from([0x02, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03]);
|
|
79
|
+
let adu3 = Buffer.from([0x02, 0x01, 0x01, 0x00, 0x00, 0x03]);
|
|
80
|
+
|
|
81
|
+
let testMaster = new ModbusSerialClient();
|
|
82
|
+
|
|
83
|
+
it('crc', ()=>{
|
|
84
|
+
crc1 = testMaster.calcCRC(adu1);
|
|
85
|
+
crc2 = testMaster.calcCRC(adu2);
|
|
86
|
+
crc3 = testMaster.calcCRC(adu3);
|
|
87
|
+
|
|
88
|
+
expect(crc1).toEqual(0x4112);
|
|
89
|
+
expect(crc2).toEqual(0x7C38);
|
|
90
|
+
expect(crc3).toEqual(0x51CC);
|
|
91
|
+
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
describe("processResAdu", () => {
|
|
98
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
99
|
+
|
|
100
|
+
let testMaster = new ModbusSerialClient();
|
|
101
|
+
|
|
102
|
+
it("response", () => {
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
req1 = testMaster.makeRequest(2, pdu1);
|
|
106
|
+
testMaster.activeRequest = req1;
|
|
107
|
+
|
|
108
|
+
let timed3 = testMaster.setReqTimer(100);
|
|
109
|
+
|
|
110
|
+
let res = Buffer.from([0x02, 0x01, 0x01, 0x00, 0x05, 0x80]);
|
|
111
|
+
|
|
112
|
+
testMaster.processResAdu(res);
|
|
113
|
+
|
|
114
|
+
testMaster.on('transaction', (req, res) =>{
|
|
115
|
+
|
|
116
|
+
expect(req[0]).toEqual(2);
|
|
117
|
+
expect(req[5]).toEqual(3);
|
|
118
|
+
expect(res[0]).toEqual(2);
|
|
119
|
+
expect(stored[5]).toEqual(80);
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
const ModbusTcpClient = require('../').ModbusTcpClient
|
|
2
|
+
|
|
3
|
+
describe("Make Mbap header", () => {
|
|
4
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
5
|
+
let pdu2 = Buffer.from([0x01, 0x00, 0x48, 0x00, 0x0A, 0x05]);
|
|
6
|
+
|
|
7
|
+
let testMaster = new ModbusTcpClient();
|
|
8
|
+
|
|
9
|
+
it("header 1", () => {
|
|
10
|
+
testMaster.transactionCount = 1;
|
|
11
|
+
let header = testMaster.makeHeader(2, pdu1.length);
|
|
12
|
+
expect(header[0]).toEqual(0);
|
|
13
|
+
expect(header[1]).toEqual(1);
|
|
14
|
+
expect(header[3]).toEqual(0);
|
|
15
|
+
expect(header[5]).toEqual(6);
|
|
16
|
+
expect(header[6]).toEqual(2);
|
|
17
|
+
expect(header.length).toEqual(7);
|
|
18
|
+
} );
|
|
19
|
+
it("header 2", () => {
|
|
20
|
+
testMaster.transactionCount = 10;
|
|
21
|
+
let header = testMaster.makeHeader(20, pdu2.length);
|
|
22
|
+
expect(header[0]).toEqual(0);
|
|
23
|
+
expect(header[1]).toEqual(10);
|
|
24
|
+
expect(header[3]).toEqual(0);
|
|
25
|
+
expect(header[5]).toEqual(7);
|
|
26
|
+
expect(header[6]).toEqual(20);
|
|
27
|
+
expect(header.length).toEqual(7);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe("Parse Mbap header", () => {
|
|
33
|
+
let header1 = [0x01, 0x01, 0x00, 0x00, 0x00, 0x05, 0x02];
|
|
34
|
+
let header2 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x00, 0x03]);
|
|
35
|
+
let header3 = Buffer.from([0x00, 0x10, 0x00, 0x00, 0x00, 0x07, 0x05]);
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
let testMaster = new ModbusTcpClient();
|
|
39
|
+
|
|
40
|
+
it("header 1", () => {
|
|
41
|
+
|
|
42
|
+
expect(()=>{testMaster.parseHeader(header1)}).toThrow(TypeError);
|
|
43
|
+
expect(()=>{testMaster.parseHeader(header1)}).toThrow('Error: Header must be a buffer instance');
|
|
44
|
+
|
|
45
|
+
} );
|
|
46
|
+
|
|
47
|
+
it("header 2", () => {
|
|
48
|
+
|
|
49
|
+
expect(()=>{testMaster.parseHeader(header2)}).toThrow(RangeError);
|
|
50
|
+
expect(()=>{testMaster.parseHeader(header2)}).toThrow('Error: Header must be 7 bytes long');
|
|
51
|
+
|
|
52
|
+
} );
|
|
53
|
+
|
|
54
|
+
it("header 3", () => {
|
|
55
|
+
|
|
56
|
+
let header = testMaster.parseHeader(header3);
|
|
57
|
+
expect(header.transactionId).toEqual(16);
|
|
58
|
+
expect(header.protocolId).toEqual(0);
|
|
59
|
+
expect(header.length).toEqual(7);
|
|
60
|
+
expect(header.unitId).toEqual(5);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe("Make reqest Buffer", () => {
|
|
66
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
67
|
+
let pdu2 = [0x01, 0x00, 0x48, 0x00, 0x0A, 0x05];
|
|
68
|
+
|
|
69
|
+
let testMaster = new ModbusTcpClient();
|
|
70
|
+
|
|
71
|
+
it("fail to make request", () => {
|
|
72
|
+
|
|
73
|
+
req1 = testMaster.makeRequest(10, pdu2);
|
|
74
|
+
req2 = testMaster.makeRequest(258, pdu1);
|
|
75
|
+
expect(req1).toEqual(null);
|
|
76
|
+
expect(req2).toEqual(null);
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
} );
|
|
80
|
+
|
|
81
|
+
it("successful request", () => {
|
|
82
|
+
|
|
83
|
+
testMaster.transactionCount = 10;
|
|
84
|
+
|
|
85
|
+
req1 = testMaster.makeRequest(2, pdu1);
|
|
86
|
+
expect(req1[1]).toEqual(11);
|
|
87
|
+
expect(req1[5]).toEqual(6);
|
|
88
|
+
expect(req1[6]).toEqual(2);
|
|
89
|
+
expect(req1[7]).toEqual(1);
|
|
90
|
+
expect(req1[11]).toEqual(3);
|
|
91
|
+
expect(req1.length).toEqual(12);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe("storeRequest", () => {
|
|
97
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
98
|
+
|
|
99
|
+
let testMaster = new ModbusTcpClient();
|
|
100
|
+
|
|
101
|
+
it("successful request", () => {
|
|
102
|
+
|
|
103
|
+
testMaster.transactionCount = 10;
|
|
104
|
+
|
|
105
|
+
req1 = testMaster.makeRequest(2, pdu1);
|
|
106
|
+
let store = testMaster.storeRequest(req1);
|
|
107
|
+
expect(store).toEqual(true);
|
|
108
|
+
expect(testMaster.reqPool.has(11)).toEqual(true);
|
|
109
|
+
let stored = testMaster.reqPool.get(11);
|
|
110
|
+
expect(stored[1]).toEqual(11);
|
|
111
|
+
expect(stored[11]).toEqual(3);
|
|
112
|
+
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe("setReqTimer", () => {
|
|
118
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
119
|
+
|
|
120
|
+
let testMaster = new ModbusTcpClient();
|
|
121
|
+
|
|
122
|
+
it("successful request", () => {
|
|
123
|
+
|
|
124
|
+
testMaster.transactionCount = 10;
|
|
125
|
+
|
|
126
|
+
req1 = testMaster.makeRequest(2, pdu1);
|
|
127
|
+
testMaster.storeRequest(req1);
|
|
128
|
+
expect(testMaster.reqPool.has(11)).toEqual(true);
|
|
129
|
+
let timed1 = testMaster.setReqTimer(10, 1500);
|
|
130
|
+
let timed2 = testMaster.setReqTimer(11, 0);
|
|
131
|
+
let timed3 = testMaster.setReqTimer(11, 10);
|
|
132
|
+
expect(timed1).toEqual(-1);
|
|
133
|
+
expect(timed2).toEqual(-1);
|
|
134
|
+
expect(testMaster.reqTimersPool.has(11)).toEqual(true);
|
|
135
|
+
let stored = testMaster.reqTimersPool.get(11);
|
|
136
|
+
expect(stored).toEqual(timed3);
|
|
137
|
+
|
|
138
|
+
testMaster.on('req-timeout', (transactionId) =>{
|
|
139
|
+
expect(transactionId).toEqual(11);
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe("processResAdu", () => {
|
|
148
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
149
|
+
|
|
150
|
+
let testMaster = new ModbusTcpClient();
|
|
151
|
+
|
|
152
|
+
it("response", () => {
|
|
153
|
+
|
|
154
|
+
testMaster.transactionCount = 10;
|
|
155
|
+
|
|
156
|
+
req1 = testMaster.makeRequest(2, pdu1);
|
|
157
|
+
testMaster.storeRequest(req1);
|
|
158
|
+
expect(testMaster.reqPool.has(11)).toEqual(true);
|
|
159
|
+
|
|
160
|
+
let timed3 = testMaster.setReqTimer(11, 10);
|
|
161
|
+
expect(testMaster.reqTimersPool.has(11)).toEqual(true);
|
|
162
|
+
|
|
163
|
+
let res = Buffer.from([0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
164
|
+
testMaster.processResAdu(res);
|
|
165
|
+
expect(testMaster.reqTimersPool.has(11)).toEqual(false);
|
|
166
|
+
expect(testMaster.reqPool.has(11)).toEqual(false);
|
|
167
|
+
|
|
168
|
+
testMaster.on('transaction', (req, res) =>{
|
|
169
|
+
|
|
170
|
+
expect(req[1]).toEqual(11);
|
|
171
|
+
expect(req[11]).toEqual(3);
|
|
172
|
+
expect(res[1]).toEqual(11);
|
|
173
|
+
expect(res[11]).toEqual(3);
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
});
|