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,506 @@
|
|
|
1
|
+
|
|
2
|
+
const ModbusServer = require('../').ModbusServer
|
|
3
|
+
|
|
4
|
+
class ModbusServerExtended extends ModbusServer{
|
|
5
|
+
constructor(mbServerCfg){
|
|
6
|
+
super(mbServerCfg)
|
|
7
|
+
|
|
8
|
+
this._internalFunctionCode.set(68, 'customService68');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
customService68(pduReqData){
|
|
12
|
+
let resp = Buffer.alloc(2);
|
|
13
|
+
resp[0] = 68;
|
|
14
|
+
resp[1] = pduReqData[0];
|
|
15
|
+
return resp
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//creating config file for basic server 1
|
|
19
|
+
let server1Cfg = {
|
|
20
|
+
inputs : 524,
|
|
21
|
+
coils : 0,
|
|
22
|
+
holdingRegisters : 512,
|
|
23
|
+
inputRegisters : 256
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//Creating basic server 1
|
|
27
|
+
basicServer1 = new ModbusServer(server1Cfg);
|
|
28
|
+
//Creating a default setting server
|
|
29
|
+
basicServer2 = new ModbusServer();
|
|
30
|
+
|
|
31
|
+
//Writing values on server registers for testing purpose
|
|
32
|
+
basicServer1.coils[0] = 0x0f;
|
|
33
|
+
basicServer1.coils[1] = 0x52;
|
|
34
|
+
basicServer2.coils[10]=0xAA;
|
|
35
|
+
|
|
36
|
+
basicServer1.inputs[1] = 0x38;
|
|
37
|
+
basicServer2.inputs[0] = 0x76;
|
|
38
|
+
|
|
39
|
+
basicServer1.holdingRegisters[10] = 0x13;
|
|
40
|
+
basicServer1.holdingRegisters.writeUint16BE(1879, 12);
|
|
41
|
+
basicServer2.holdingRegisters.writeFloatBE(3.14);
|
|
42
|
+
|
|
43
|
+
basicServer1.inputRegisters.writeUInt32BE(25489);
|
|
44
|
+
basicServer2.inputRegisters.writeFloatBE(125.8);
|
|
45
|
+
|
|
46
|
+
describe("Server instantation", () => {
|
|
47
|
+
|
|
48
|
+
it("correct input buffer length for server 1", () => {
|
|
49
|
+
expect(basicServer1.inputs.length).toEqual(66);
|
|
50
|
+
});
|
|
51
|
+
it("correct default inputs buffer lenght on server 2", () => {
|
|
52
|
+
expect(basicServer2.inputs.length).toEqual(256);
|
|
53
|
+
});
|
|
54
|
+
it("correct coil buffer length for server 1", () => {
|
|
55
|
+
expect(basicServer1.coils.length).toEqual(1024);
|
|
56
|
+
});
|
|
57
|
+
it("correct default coils buffer lenght on server 2", () => {
|
|
58
|
+
expect(basicServer2.coils.length).toEqual(256);
|
|
59
|
+
});
|
|
60
|
+
it("correct holding register buffer length for server 1", () => {
|
|
61
|
+
expect(basicServer1.holdingRegisters.length).toEqual(1024);
|
|
62
|
+
});
|
|
63
|
+
it("correct default holding register buffer lenght on server 2", () => {
|
|
64
|
+
expect(basicServer2.holdingRegisters.length).toEqual(4096);
|
|
65
|
+
});
|
|
66
|
+
it("correct input register buffer length for server 1", () => {
|
|
67
|
+
expect(basicServer1.inputRegisters.length).toEqual(512);
|
|
68
|
+
});
|
|
69
|
+
it("correct default input register buffer lenght on server 2", () => {
|
|
70
|
+
expect(basicServer2.inputRegisters.length).toEqual(4096);
|
|
71
|
+
});
|
|
72
|
+
it("chech correct writing register from user app", () => {
|
|
73
|
+
expect(basicServer1.holdingRegisters[12]).toEqual(0x07);
|
|
74
|
+
expect(basicServer1.holdingRegisters[13]).toEqual(0x57);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe("Read Coils status", () => {
|
|
79
|
+
let pdu1 = Buffer.from([0x01, 0x00, 0x00, 0x00, 0x03]);
|
|
80
|
+
let pdu2 = Buffer.from([0x01, 0x13, 0xA5, 0x00, 0x03]);
|
|
81
|
+
let pdu3 = Buffer.from([0x01, 0x00, 0xA5, 0x07, 0xD3]);
|
|
82
|
+
let pdu4 = Buffer.from([0x01, 0x00, 0x48, 0x00, 0x0A]);
|
|
83
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
84
|
+
let exceptionserver2 = new ModbusServer();
|
|
85
|
+
|
|
86
|
+
it("correct response server 1", () => {
|
|
87
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
88
|
+
expect(res1[0]).toEqual(1);
|
|
89
|
+
expect(res1[1]).toEqual(1);
|
|
90
|
+
expect(res1[2]).toEqual(7);
|
|
91
|
+
} );
|
|
92
|
+
it("correct response server 1 reading on holdings", () => {
|
|
93
|
+
let res1 = basicServer1.processReqPdu(pdu4)
|
|
94
|
+
expect(res1[0]).toEqual(1);
|
|
95
|
+
expect(res1[1]).toEqual(2);
|
|
96
|
+
expect(res1[2]).toEqual(0);
|
|
97
|
+
expect(res1[3]).toEqual(3);
|
|
98
|
+
});
|
|
99
|
+
it("Check Illegal address", () => {
|
|
100
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
101
|
+
expect(res1[0]).toEqual(0x81);
|
|
102
|
+
expect(res1[1]).toEqual(2);
|
|
103
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
104
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
105
|
+
})
|
|
106
|
+
});
|
|
107
|
+
it("Check Illegal data Value", () => {
|
|
108
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
109
|
+
expect(res1[0]).toEqual(0x81);
|
|
110
|
+
expect(res1[1]).toEqual(3);
|
|
111
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
112
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
113
|
+
})
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe("Read inputs status", () => {
|
|
118
|
+
let pdu1 = Buffer.from([0x02, 0x00, 0x00, 0x00, 0x05]);
|
|
119
|
+
let pdu2 = Buffer.from([0x02, 0x23, 0xA5, 0x00, 0x03]);
|
|
120
|
+
let pdu3 = Buffer.from([0x02, 0x00, 0xA5, 0x07, 0xD3]);
|
|
121
|
+
let pdu4 = Buffer.from([0x02, 0x00, 0x00, 0x00, 0x0C]);
|
|
122
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
123
|
+
let exceptionserver2 = new ModbusServer();
|
|
124
|
+
|
|
125
|
+
it("correct response server 1", () => {
|
|
126
|
+
let res1 = basicServer1.processReqPdu(pdu4)
|
|
127
|
+
expect(res1[0]).toEqual(2);
|
|
128
|
+
expect(res1[1]).toEqual(2);
|
|
129
|
+
expect(res1[2]).toEqual(0);
|
|
130
|
+
expect(res1[3]).toEqual(8);
|
|
131
|
+
} );
|
|
132
|
+
it("correct response server 2", () => {
|
|
133
|
+
let res1 = basicServer2.processReqPdu(pdu1)
|
|
134
|
+
expect(res1[0]).toEqual(2);
|
|
135
|
+
expect(res1[1]).toEqual(1);
|
|
136
|
+
expect(res1[2]).toEqual(0x16);
|
|
137
|
+
});
|
|
138
|
+
it("Check Illegal address", () => {
|
|
139
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
140
|
+
expect(res1[0]).toEqual(0x82);
|
|
141
|
+
expect(res1[1]).toEqual(2);
|
|
142
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
143
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
144
|
+
})
|
|
145
|
+
});
|
|
146
|
+
it("Check Illegal data Value", () => {
|
|
147
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
148
|
+
expect(res1[0]).toEqual(0x82);
|
|
149
|
+
expect(res1[1]).toEqual(3);
|
|
150
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
151
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
152
|
+
})
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe("Read holding registers", () => {
|
|
157
|
+
let pdu1 = Buffer.from([0x03, 0x00, 0x05, 0x00, 0x01]);
|
|
158
|
+
let pdu2 = Buffer.from([0x03, 0xA3, 0xA5, 0x00, 0x03]);
|
|
159
|
+
let pdu3 = Buffer.from([0x03, 0x00, 0xA5, 0x00, 0x7F]);
|
|
160
|
+
let pdu4 = Buffer.from([0x03, 0x00, 0x05, 0x00, 0x02]);
|
|
161
|
+
let pdu5 = Buffer.from([0x03, 0x00, 0x0, 0x00, 0x02]);
|
|
162
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
163
|
+
let exceptionserver2 = new ModbusServer();
|
|
164
|
+
|
|
165
|
+
it("correct response server 1", () => {
|
|
166
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
167
|
+
expect(res1[0]).toEqual(3);
|
|
168
|
+
expect(res1[1]).toEqual(2);
|
|
169
|
+
expect(res1[2]).toEqual(0x13);
|
|
170
|
+
expect(res1[3]).toEqual(0);
|
|
171
|
+
} );
|
|
172
|
+
it("correct response server 1 reading on holdings", () => {
|
|
173
|
+
let res1 = basicServer1.processReqPdu(pdu4)
|
|
174
|
+
expect(res1[0]).toEqual(3);
|
|
175
|
+
expect(res1[1]).toEqual(4);
|
|
176
|
+
expect(res1[2]).toEqual(0x13);
|
|
177
|
+
expect(res1[3]).toEqual(0);
|
|
178
|
+
expect(res1[4]).toEqual(0x07);
|
|
179
|
+
expect(res1[5]).toEqual(0x57);
|
|
180
|
+
});
|
|
181
|
+
/*
|
|
182
|
+
it("correct response server 2 reading on holdings", () => {
|
|
183
|
+
let res1 = basicServer2.processReqPdu(pdu5)
|
|
184
|
+
expect(res1[0]).toEqual(3);
|
|
185
|
+
expect(res1[1]).toEqual(4);
|
|
186
|
+
expect(res1[2]).toEqual(0x13);
|
|
187
|
+
expect(res1[3]).toEqual(0);
|
|
188
|
+
expect(res1[4]).toEqual(0x07);
|
|
189
|
+
expect(res1[5]).toEqual(0x57);
|
|
190
|
+
});*/
|
|
191
|
+
it("Check Illegal address", () => {
|
|
192
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
193
|
+
expect(res1[0]).toEqual(0x83);
|
|
194
|
+
expect(res1[1]).toEqual(2);
|
|
195
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
196
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
197
|
+
})
|
|
198
|
+
});
|
|
199
|
+
it("Check Illegal data Value", () => {
|
|
200
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
201
|
+
expect(res1[0]).toEqual(0x83);
|
|
202
|
+
expect(res1[1]).toEqual(3);
|
|
203
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
204
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
205
|
+
})
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
describe("Read input registers", () => {
|
|
210
|
+
let pdu1 = Buffer.from([0x04, 0x00, 0x00, 0x00, 0x02]);
|
|
211
|
+
let pdu2 = Buffer.from([0x04, 0xA3, 0xA5, 0x00, 0x03]);
|
|
212
|
+
let pdu3 = Buffer.from([0x04, 0x00, 0xA5, 0x00, 0x7F]);
|
|
213
|
+
let pdu4 = Buffer.from([0x04, 0x00, 0x00, 0x00, 0x02]);
|
|
214
|
+
|
|
215
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
216
|
+
let exceptionserver2 = new ModbusServer();
|
|
217
|
+
|
|
218
|
+
it("correct response server 1", () => {
|
|
219
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
220
|
+
expect(res1[0]).toEqual(4);
|
|
221
|
+
expect(res1[1]).toEqual(4);
|
|
222
|
+
expect(res1[2]).toEqual(0);
|
|
223
|
+
expect(res1[3]).toEqual(0);
|
|
224
|
+
expect(res1[4]).toEqual(0x63);
|
|
225
|
+
expect(res1[5]).toEqual(0x91);
|
|
226
|
+
} );
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
it("correct response server 2 reading on holdings", () => {
|
|
230
|
+
let res1 = basicServer2.processReqPdu(pdu5)
|
|
231
|
+
expect(res1[0]).toEqual(3);
|
|
232
|
+
expect(res1[1]).toEqual(4);
|
|
233
|
+
expect(res1[2]).toEqual(0x13);
|
|
234
|
+
expect(res1[3]).toEqual(0);
|
|
235
|
+
expect(res1[4]).toEqual(0x07);
|
|
236
|
+
expect(res1[5]).toEqual(0x57);
|
|
237
|
+
});*/
|
|
238
|
+
it("Check Illegal address", () => {
|
|
239
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
240
|
+
expect(res1[0]).toEqual(0x84);
|
|
241
|
+
expect(res1[1]).toEqual(2);
|
|
242
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
243
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
244
|
+
})
|
|
245
|
+
});
|
|
246
|
+
it("Check Illegal data Value", () => {
|
|
247
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
248
|
+
expect(res1[0]).toEqual(0x84);
|
|
249
|
+
expect(res1[1]).toEqual(3);
|
|
250
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
251
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
252
|
+
})
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
describe("Write Single Coils", () => {
|
|
257
|
+
let pdu1 = Buffer.from([0x05, 0x00, 27, 0xFF, 0x00]);
|
|
258
|
+
let pdu2 = Buffer.from([0x05, 0x13, 0xA5, 0x00, 0x00]);
|
|
259
|
+
let pdu3 = Buffer.from([0x05, 0x00, 0xA5, 0x0, 0x03]);
|
|
260
|
+
let pdu4 = Buffer.from([0x05, 0x00, 0x00, 0x00, 0x00]);
|
|
261
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
262
|
+
let exceptionserver2 = new ModbusServer();
|
|
263
|
+
|
|
264
|
+
it("correct response server 1", () => {
|
|
265
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
266
|
+
|
|
267
|
+
expect(res1[0]).toEqual(5);
|
|
268
|
+
expect(res1[2]).toEqual(27);
|
|
269
|
+
expect(res1[3]).toEqual(0xFF);
|
|
270
|
+
expect(basicServer1.getBoolFromBuffer(basicServer1.coils, 27)).toEqual(true)
|
|
271
|
+
} );
|
|
272
|
+
|
|
273
|
+
it("Check Illegal address", () => {
|
|
274
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
275
|
+
expect(res1[0]).toEqual(0x85);
|
|
276
|
+
expect(res1[1]).toEqual(2);
|
|
277
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
278
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
279
|
+
})
|
|
280
|
+
});
|
|
281
|
+
it("Check Illegal data Value", () => {
|
|
282
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
283
|
+
expect(res1[0]).toEqual(0x85);
|
|
284
|
+
expect(res1[1]).toEqual(3);
|
|
285
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
286
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
287
|
+
})
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
describe("Write Single Register", () => {
|
|
292
|
+
let pdu1 = Buffer.from([0x06, 0x00, 20, 0x34, 0x12]);
|
|
293
|
+
let pdu2 = Buffer.from([0x06, 0x13, 0xA5, 0x00, 0x00]);
|
|
294
|
+
let pdu3 = Buffer.from([0x06, 0x00, 0xA5, 0x00, 0x03, 0x45]);
|
|
295
|
+
let pdu4 = Buffer.from([0x06, 0x00, 0x00, 0x00, 0x00]);
|
|
296
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
297
|
+
let exceptionserver2 = new ModbusServer();
|
|
298
|
+
|
|
299
|
+
it("correct response server 1", () => {
|
|
300
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
301
|
+
|
|
302
|
+
expect(res1[0]).toEqual(6);
|
|
303
|
+
expect(res1[2]).toEqual(20);
|
|
304
|
+
expect(res1[3]).toEqual(0x34);
|
|
305
|
+
expect(basicServer1.getWordFromBuffer(basicServer1.holdingRegisters, 20)[0]).toEqual(0x34)
|
|
306
|
+
} );
|
|
307
|
+
|
|
308
|
+
it("Check Illegal address", () => {
|
|
309
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
310
|
+
expect(res1[0]).toEqual(0x86);
|
|
311
|
+
expect(res1[1]).toEqual(2);
|
|
312
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
313
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
314
|
+
})
|
|
315
|
+
});
|
|
316
|
+
it("Check Illegal data Value", () => {
|
|
317
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
318
|
+
expect(res1[0]).toEqual(0x86);
|
|
319
|
+
expect(res1[1]).toEqual(3);
|
|
320
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
321
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
322
|
+
})
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
describe("Write Multiples Coils", () => {
|
|
327
|
+
let pdu1 = Buffer.from([0x0F, 0x00, 30, 0x00, 0x0A, 0x02, 0x68, 0x01]);
|
|
328
|
+
let pdu2 = Buffer.from([0x0F, 0x13, 0xA5, 0x00, 0x02, 0x01, 0x01]);
|
|
329
|
+
let pdu3 = Buffer.from([0x0F, 0x00, 0x40, 0x07, 0xB3, 0xF6, 0x00]);
|
|
330
|
+
let pdu4 = Buffer.from([0x0F, 0x00, 0x50, 0x00, 0x23, 0x02, 0x00]);
|
|
331
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
332
|
+
let exceptionserver2 = new ModbusServer();
|
|
333
|
+
|
|
334
|
+
it("correct response server 1", () => {
|
|
335
|
+
basicServer1.setBoolToBuffer(true, basicServer1.holdingRegisters, 39);
|
|
336
|
+
expect(basicServer1.getBoolFromBuffer(basicServer1.coils, 39)).toEqual(true)
|
|
337
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
338
|
+
expect(res1[0]).toEqual(15);
|
|
339
|
+
expect(res1[2]).toEqual(30);
|
|
340
|
+
expect(res1[4]).toEqual(0x0A);
|
|
341
|
+
expect(basicServer1.getBoolFromBuffer(basicServer1.coils, 33)).toEqual(true)
|
|
342
|
+
expect(basicServer1.getBoolFromBuffer(basicServer1.coils, 35)).toEqual(true)
|
|
343
|
+
expect(basicServer1.getBoolFromBuffer(basicServer1.coils, 36)).toEqual(true)
|
|
344
|
+
expect(basicServer1.getBoolFromBuffer(basicServer1.coils, 38)).toEqual(true)
|
|
345
|
+
expect(basicServer1.getBoolFromBuffer(basicServer1.coils, 39)).toEqual(false)
|
|
346
|
+
} );
|
|
347
|
+
|
|
348
|
+
it("Check Illegal address", () => {
|
|
349
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
350
|
+
expect(res1[0]).toEqual(0x8F);
|
|
351
|
+
expect(res1[1]).toEqual(2);
|
|
352
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
353
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
354
|
+
})
|
|
355
|
+
});
|
|
356
|
+
it("Check Illegal data Value", () => {
|
|
357
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
358
|
+
expect(res1[0]).toEqual(0x8F);
|
|
359
|
+
expect(res1[1]).toEqual(3);
|
|
360
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
361
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
362
|
+
})
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
describe("Write Multiples Register", () => {
|
|
367
|
+
let pdu1 = Buffer.from([0x10, 0x00, 20, 0x00, 0x03, 0x06, 0x18, 0x21, 0x36, 0xdf, 0x85, 0xca]);
|
|
368
|
+
let pdu2 = Buffer.from([0x10, 0x13, 0xA5, 0x00, 0x02, 0x04, 0x01, 0, 25, 78]);
|
|
369
|
+
let pdu3 = Buffer.from([0x10, 0x00, 0x40, 0x00, 0x7c, 0xF6, 0x00]);
|
|
370
|
+
let pdu4 = Buffer.from([0x10, 0x00, 0x50, 0x00, 0x02, 0x04, 0x00, 0x01, 0x25]);
|
|
371
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
372
|
+
let exceptionserver2 = new ModbusServer();
|
|
373
|
+
|
|
374
|
+
it("correct response server 1", () => {
|
|
375
|
+
|
|
376
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
377
|
+
expect(res1[0]).toEqual(16);
|
|
378
|
+
expect(res1[2]).toEqual(20);
|
|
379
|
+
expect(res1[4]).toEqual(0x03);
|
|
380
|
+
expect(basicServer1.getWordFromBuffer(basicServer1.coils, 20)[0]).toEqual(0x18)
|
|
381
|
+
expect(basicServer1.getWordFromBuffer(basicServer1.holdingRegisters, 21)[1]).toEqual(0xdf)
|
|
382
|
+
expect(basicServer1.getWordFromBuffer(basicServer1.holdingRegisters, 22)[1]).toEqual(0xca)
|
|
383
|
+
} );
|
|
384
|
+
|
|
385
|
+
it("Check Illegal address", () => {
|
|
386
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
387
|
+
expect(res1[0]).toEqual(0x90);
|
|
388
|
+
expect(res1[1]).toEqual(2);
|
|
389
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
390
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
391
|
+
})
|
|
392
|
+
});
|
|
393
|
+
it("Check Illegal data Value", () => {
|
|
394
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
395
|
+
expect(res1[0]).toEqual(0x90);
|
|
396
|
+
expect(res1[1]).toEqual(3);
|
|
397
|
+
let res2 = exceptionserver1.processReqPdu(pdu4)
|
|
398
|
+
expect(res2[0]).toEqual(0x90);
|
|
399
|
+
expect(res2[1]).toEqual(3);
|
|
400
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
401
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
402
|
+
})
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
describe("Mask Write Register", () => {
|
|
408
|
+
let pdu1 = Buffer.from([0x16, 0x00, 8, 0x00, 0xf2, 0x00, 0x25]);
|
|
409
|
+
let pdu2 = Buffer.from([0x16, 0x13, 0xA5, 0x00, 0x02, 0x04, 0x01]);
|
|
410
|
+
let pdu3 = Buffer.from([0x16, 0x00, 0x40, 0x00, 0x7c, 0xF6]);
|
|
411
|
+
|
|
412
|
+
let valBuffer = Buffer.from([0x00, 0x12]);
|
|
413
|
+
basicServer1.setWordToBuffer(valBuffer, basicServer1.holdingRegisters, 8);
|
|
414
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
415
|
+
let exceptionserver2 = new ModbusServer();
|
|
416
|
+
|
|
417
|
+
it("correct response server 1", () => {
|
|
418
|
+
|
|
419
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
420
|
+
|
|
421
|
+
expect(res1[0]).toEqual(0x16);
|
|
422
|
+
expect(res1[2]).toEqual(8);
|
|
423
|
+
expect(res1[4]).toEqual(0xf2);
|
|
424
|
+
expect(res1[6]).toEqual(0x25);
|
|
425
|
+
expect(basicServer1.getWordFromBuffer(basicServer1.holdingRegisters, 8)[0]).toEqual(0)
|
|
426
|
+
expect(basicServer1.getWordFromBuffer(basicServer1.holdingRegisters, 8)[1]).toEqual(0x17)
|
|
427
|
+
} );
|
|
428
|
+
|
|
429
|
+
it("Check Illegal address", () => {
|
|
430
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
431
|
+
expect(res1[0]).toEqual(0x96);
|
|
432
|
+
expect(res1[1]).toEqual(2);
|
|
433
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
434
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
435
|
+
})
|
|
436
|
+
});
|
|
437
|
+
it("Check Illegal data Value", () => {
|
|
438
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
439
|
+
expect(res1[0]).toEqual(0x96);
|
|
440
|
+
expect(res1[1]).toEqual(3);
|
|
441
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
442
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
443
|
+
})
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
describe("Read/Write Multiple Registers", () => {
|
|
449
|
+
let pdu1 = Buffer.from([0x17, 0x00, 0, 0x00, 0x03, 0, 100, 0, 2, 4, 0x0f, 0xAA, 0xBB, 0xCC]);
|
|
450
|
+
let pdu2 = Buffer.from([0x17, 0x13, 0xA5, 0x00, 0x02, 0, 100, 0, 2, 4, 0x0f, 0xAA, 0xBB, 0xCC]);
|
|
451
|
+
let pdu3 = Buffer.from([0x17, 0x00, 0, 0x00, 0x7E, 0, 100, 0, 2, 4, 0x0f, 0xAA, 0xBB, 0xCC]);
|
|
452
|
+
let pdu4 = Buffer.from([0x17, 0x00, 0, 0x00, 0x00, 0, 100, 0, 2, 4, 0x0f, 0xAA, 0xBB, 0xCC]);
|
|
453
|
+
let pdu5 = Buffer.from([0x17, 0x00, 0, 0x00, 0x01, 0, 100, 0x00, 0x7A, 4, 0x0f, 0xAA, 0xBB, 0xCC]);
|
|
454
|
+
|
|
455
|
+
let exceptionserver1 = new ModbusServer(server1Cfg);
|
|
456
|
+
let exceptionserver2 = new ModbusServer();
|
|
457
|
+
|
|
458
|
+
it("correct response server 1", () => {
|
|
459
|
+
basicServer1.holdingRegisters[4] = 0xAB;
|
|
460
|
+
let res1 = basicServer1.processReqPdu(pdu1)
|
|
461
|
+
expect(res1[0]).toEqual(0x17);
|
|
462
|
+
expect(res1[1]).toEqual(0x06);
|
|
463
|
+
expect(res1[6]).toEqual(0xAB);
|
|
464
|
+
expect(basicServer1.getWordFromBuffer(basicServer1.holdingRegisters, 101)[0]).toEqual(0xBB)
|
|
465
|
+
expect(basicServer1.getWordFromBuffer(basicServer1.holdingRegisters, 101)[1]).toEqual(0XCC)
|
|
466
|
+
} );
|
|
467
|
+
|
|
468
|
+
it("Check Illegal address", () => {
|
|
469
|
+
let res1 = exceptionserver2.processReqPdu(pdu2)
|
|
470
|
+
expect(res1[0]).toEqual(0x97);
|
|
471
|
+
expect(res1[1]).toEqual(2);
|
|
472
|
+
exceptionserver2.on('exception', (functionCode, message) =>{
|
|
473
|
+
expect(message).toEqual('ILLEGAL DATA ADDRESS');
|
|
474
|
+
})
|
|
475
|
+
});
|
|
476
|
+
it("Check Illegal data Value", () => {
|
|
477
|
+
let res1 = exceptionserver1.processReqPdu(pdu3)
|
|
478
|
+
expect(res1[0]).toEqual(0x97);
|
|
479
|
+
expect(res1[1]).toEqual(3);
|
|
480
|
+
let res2 = exceptionserver1.processReqPdu(pdu4)
|
|
481
|
+
expect(res2[0]).toEqual(0x97);
|
|
482
|
+
expect(res2[1]).toEqual(3);
|
|
483
|
+
let res3 = exceptionserver1.processReqPdu(pdu5)
|
|
484
|
+
expect(res3[0]).toEqual(0x97);
|
|
485
|
+
expect(res3[1]).toEqual(3);
|
|
486
|
+
exceptionserver1.on('exception', (functionCode, message) =>{
|
|
487
|
+
expect(message).toEqual('ILLEGAL DATA VALUE');
|
|
488
|
+
})
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
describe("Extended server with custom modbus function", () => {
|
|
494
|
+
let pdu1 = Buffer.from([68, 21]);
|
|
495
|
+
|
|
496
|
+
let serverExtended = new ModbusServerExtended(server1Cfg);
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
it("correct response server 1", () => {
|
|
500
|
+
let res1 = serverExtended.processReqPdu(pdu1)
|
|
501
|
+
expect(res1[0]).toEqual(68);
|
|
502
|
+
expect(res1[1]).toEqual(21);
|
|
503
|
+
|
|
504
|
+
} );
|
|
505
|
+
|
|
506
|
+
});
|