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,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
** Modbus TCP Aplication Data Unit base class.
|
|
3
|
-
* @module protocol/serial_adu
|
|
4
|
-
* @author Hector E. Socarras.
|
|
5
|
-
* @version 0.4.0
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const ADU = require('./adu');
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
module.exports = class SerialADU extends ADU {
|
|
12
|
-
constructor(aduRaw =Buffer.alloc(1)){
|
|
13
|
-
super(aduRaw)
|
|
14
|
-
|
|
15
|
-
//propiedad error cheking
|
|
16
|
-
this.errorCheck = 0;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
static isAsciiAdu(aduBuffer){
|
|
20
|
-
let firstByte = aduBuffer[0];
|
|
21
|
-
let lastByte = aduBuffer[aduBuffer.length - 1];
|
|
22
|
-
let preLastByte = aduBuffer[aduBuffer.length - 2];
|
|
23
|
-
|
|
24
|
-
if(firstByte == 0x3A & preLastByte == 0x0D & lastByte == 0x0A){
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
else return false
|
|
28
|
-
}
|
|
29
|
-
}
|
package/src/protocol/tcp_adu.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
** Modbus TCP Aplication Data Unit base class.
|
|
3
|
-
* @module protocol/tcp_adu
|
|
4
|
-
* @author Hector E. Socarras.
|
|
5
|
-
* @version 0.4.0
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const ADU = require('./adu');
|
|
9
|
-
const MBAP = require('./mbap');
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Class representing a modbus tcp aplication data unit.
|
|
13
|
-
* @extends ADU
|
|
14
|
-
*/
|
|
15
|
-
class TcpADU extends ADU {
|
|
16
|
-
/**
|
|
17
|
-
* Create a ADU.
|
|
18
|
-
* @param {Buffer} aduRaw Frame modbus.
|
|
19
|
-
*/
|
|
20
|
-
constructor(aduRaw = Buffer.alloc(1)){
|
|
21
|
-
super(aduRaw);
|
|
22
|
-
|
|
23
|
-
this.transactionCounter = 0;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Header of frame modbus tcp
|
|
27
|
-
* @type {object}
|
|
28
|
-
*/
|
|
29
|
-
this.mbap = new MBAP();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* function to make adu frame from MBAP and PDU object
|
|
34
|
-
*/
|
|
35
|
-
MakeBuffer(){
|
|
36
|
-
|
|
37
|
-
//creando el buffer de la pdu
|
|
38
|
-
this.pdu.MakeBuffer();
|
|
39
|
-
|
|
40
|
-
//creando en buffer del mbap
|
|
41
|
-
this.mbap.transactionID = this.transactionCounter;
|
|
42
|
-
this.mbap.protocolID = 0;
|
|
43
|
-
this.mbap.length = this.pdu.pduBuffer.length+1;
|
|
44
|
-
this.mbap.unitID = this.address;
|
|
45
|
-
this.mbap.MakeBuffer();
|
|
46
|
-
|
|
47
|
-
var buff = Buffer.alloc(this.pdu.pduBuffer.length+this.mbap.mbapBuffer.length);
|
|
48
|
-
|
|
49
|
-
this.mbap.mbapBuffer.copy(buff);
|
|
50
|
-
this.pdu.pduBuffer.copy(buff,7);
|
|
51
|
-
|
|
52
|
-
this.aduBuffer = buff;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
*function to parse the adu buffer to make MBAP and PDU object
|
|
57
|
-
* @throws {string}
|
|
58
|
-
*/
|
|
59
|
-
ParseBuffer() {
|
|
60
|
-
|
|
61
|
-
if(this.aduBuffer.length > 7) {
|
|
62
|
-
try {
|
|
63
|
-
this.mbap.mbapBuffer = this.aduBuffer.slice(0,7);
|
|
64
|
-
this.mbap.ParseBuffer();
|
|
65
|
-
this.address = this.mbap.unitID;
|
|
66
|
-
this.pdu.pduBuffer = this.aduBuffer.slice(7);
|
|
67
|
-
this.pdu.ParseBuffer();
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
catch(err)
|
|
71
|
-
{
|
|
72
|
-
throw err;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
throw new Error('adu buffer not contain a valid frame');
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
module.exports = TcpADU;
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
** Word datatype memory.
|
|
3
|
-
* @module protocol/word_register
|
|
4
|
-
* @author Hector E. Socarras.
|
|
5
|
-
* @version 0.4.0
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Class representing a word memory area.
|
|
10
|
-
*/
|
|
11
|
-
class WordRegister {
|
|
12
|
-
/**
|
|
13
|
-
* Create a word register.
|
|
14
|
-
* @param {number} size total amount of references (inputs or holdings registers).
|
|
15
|
-
*/
|
|
16
|
-
constructor(size = 1024){
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
*core. using litle endian encoding
|
|
20
|
-
*@type {Buffer}
|
|
21
|
-
*/
|
|
22
|
-
this.registerBuffer = Buffer.alloc(size * 2);
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
*@type {number}
|
|
26
|
-
*/
|
|
27
|
-
this.size = size;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
*function to encode a register to send through a stream.
|
|
36
|
-
* protocol send in BE; register are store in LE
|
|
37
|
-
*@param {number} dataAddress address of register
|
|
38
|
-
*@return {buffer}
|
|
39
|
-
*/
|
|
40
|
-
EncodeRegister(dataAddress = 0){
|
|
41
|
-
if(dataAddress <= this.size){
|
|
42
|
-
let offset = dataAddress * 2;
|
|
43
|
-
|
|
44
|
-
let buffRegister = Buffer.alloc(2);
|
|
45
|
-
buffRegister[0] = this.registerBuffer[offset + 1];
|
|
46
|
-
buffRegister[1] = this.registerBuffer[offset];
|
|
47
|
-
return buffRegister;
|
|
48
|
-
}
|
|
49
|
-
else{
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
*function to decode a register receive through a stream.
|
|
56
|
-
* protocol send in BE; register are store in LE
|
|
57
|
-
*@param {buffer} value
|
|
58
|
-
*@param {number} dataAddress address of register
|
|
59
|
-
*/
|
|
60
|
-
DecodeRegister(value, dataAddress = 0){
|
|
61
|
-
if(dataAddress <= this.size){
|
|
62
|
-
let offset = dataAddress * 2;
|
|
63
|
-
|
|
64
|
-
this.registerBuffer[offset] = value[1];
|
|
65
|
-
this.registerBuffer[offset + 1] = value[0];
|
|
66
|
-
return true;
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
else{
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* function to set the register
|
|
76
|
-
* @param {Buffer} value a Buffer with value encode in litleendian
|
|
77
|
-
* @param {number} dataAddress address of register
|
|
78
|
-
* @return {boolean} true if success
|
|
79
|
-
*/
|
|
80
|
-
SetRegister(value, dataAddress = 0){
|
|
81
|
-
if(dataAddress <= this.size){
|
|
82
|
-
let offset = dataAddress * 2;
|
|
83
|
-
if (value instanceof Buffer && value.length == 2) {
|
|
84
|
-
value.copy(this.registerBuffer, offset)
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
else{
|
|
88
|
-
throw new typeError('Value must be a size 2 Buffer');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
else{
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* function to get the register
|
|
99
|
-
* @param {number} dataAddress address of register
|
|
100
|
-
* @return {buffer}
|
|
101
|
-
*/
|
|
102
|
-
GetRegister(dataAddress = 0){
|
|
103
|
-
if(dataAddress <= this.size){
|
|
104
|
-
let offset = dataAddress * 2;
|
|
105
|
-
|
|
106
|
-
return this.registerBuffer.slice(offset, offset + 2);
|
|
107
|
-
}
|
|
108
|
-
else{
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* function to rezise the buffer of register
|
|
115
|
-
* @param {number} newSise
|
|
116
|
-
*/
|
|
117
|
-
ReSize(newSize){
|
|
118
|
-
this.registerBuffer = Buffer.alloc(newSize * 2);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
module.exports = WordRegister;
|
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Modbus Serial encapsulated on Tcp server module.
|
|
3
|
-
* @module server/m_stcp_server.
|
|
4
|
-
* @author Hector E. Socarras.
|
|
5
|
-
* @version 0.4.0
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const ModbusSlave = require('../protocol/modbus_slave');
|
|
9
|
-
const TcpServer = require('../net/tcpserver');
|
|
10
|
-
const RTU_ADU = require('../protocol/rtu_adu');
|
|
11
|
-
const ASCII_ADU = require('../protocol/ascii_adu');
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Class representing a modbus serial over tcp server.
|
|
15
|
-
* @extends ModbusSlave
|
|
16
|
-
*/
|
|
17
|
-
class ModbusSTCPServer extends ModbusSlave {
|
|
18
|
-
/**
|
|
19
|
-
* Create a Modbus Tcp Server.
|
|
20
|
-
* @param {number} p Port to listen.
|
|
21
|
-
* @param {string} mode mode of work. 'rtu' frame rtu only, 'ascii' frame ascii only, 'aut' (default) both mode
|
|
22
|
-
*/
|
|
23
|
-
constructor(p = 502, modbusAddress = 1, mode = 'aut'){
|
|
24
|
-
super(modbusAddress);
|
|
25
|
-
|
|
26
|
-
var self = this;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* network layer
|
|
30
|
-
* @type {object}
|
|
31
|
-
*/
|
|
32
|
-
this.tcpServer = new TcpServer();
|
|
33
|
-
|
|
34
|
-
//Adding listeners to tcpServer events
|
|
35
|
-
|
|
36
|
-
this.tcpServer.onData = this.ProcessModbusIndication.bind(this);
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* @fires ModbusTCPServer#connection
|
|
40
|
-
*/
|
|
41
|
-
this.tcpServer.onConnection = function EmitConnection (socket) {
|
|
42
|
-
/**
|
|
43
|
-
* connection event.
|
|
44
|
-
* Emited when new connecton is sablished
|
|
45
|
-
* @event ModbusTCPServer#connection
|
|
46
|
-
* @type {object}
|
|
47
|
-
* @see https://nodejs.org/api/net.html
|
|
48
|
-
*/
|
|
49
|
-
this.emit('connection',socket);
|
|
50
|
-
}.bind(this);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Event connection closed
|
|
55
|
-
* Emited when socket closed
|
|
56
|
-
* @see https://nodejs.org/api/net.html
|
|
57
|
-
* @fires ModbusTCPServer#connection-closed
|
|
58
|
-
*/
|
|
59
|
-
this.tcpServer.onConnectionClose = function EmitConnectionClosed(socket){
|
|
60
|
-
/**
|
|
61
|
-
* connection-closed event.
|
|
62
|
-
* @event ModbusTCPServer#connection-closed
|
|
63
|
-
* @type {object}
|
|
64
|
-
*/
|
|
65
|
-
this.emit('connection-closed', socket)
|
|
66
|
-
}.bind(this);
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Event access denied
|
|
70
|
-
* Emited when new connecton is rejected by filter rules
|
|
71
|
-
* @fires ModbusTCPServer#access-denied
|
|
72
|
-
*/
|
|
73
|
-
this.tcpServer.onAccessDenied = function EmitAccesDenied(socket){
|
|
74
|
-
/**
|
|
75
|
-
* access-denied event.
|
|
76
|
-
* @event ModbusTCPServer#access-denied
|
|
77
|
-
* @type {object}
|
|
78
|
-
*/
|
|
79
|
-
this.emit('access-denied', socket);
|
|
80
|
-
}.bind(this);
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Event listening
|
|
84
|
-
* Emited when server is listening
|
|
85
|
-
* @see https://nodejs.org/api/net.html
|
|
86
|
-
* @fires ModbusTCPServer#listening
|
|
87
|
-
*/
|
|
88
|
-
this.tcpServer.onListening = function EmitListening(port){
|
|
89
|
-
/**
|
|
90
|
-
* listening event.
|
|
91
|
-
* @event ModbusTCPServer#listening
|
|
92
|
-
* @type {number}
|
|
93
|
-
*/
|
|
94
|
-
this.emit('listening',self.port);
|
|
95
|
-
}.bind(this);
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Event closed
|
|
99
|
-
* Emited when server is closed
|
|
100
|
-
* @see https://nodejs.org/api/net.html
|
|
101
|
-
* @fires ModbusTCPServer#closed
|
|
102
|
-
*/
|
|
103
|
-
this.tcpServer.onServerClose = function EmitClosed(){
|
|
104
|
-
/**
|
|
105
|
-
* closed event.
|
|
106
|
-
* @event ModbusTCPServer#closed
|
|
107
|
-
*/
|
|
108
|
-
this.emit('closed');
|
|
109
|
-
}.bind(this);
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Event error
|
|
113
|
-
* Emited when error hapen
|
|
114
|
-
* @fires ModbusTCPServer#error
|
|
115
|
-
*/
|
|
116
|
-
this.tcpServer.onError = function EmitError(err){
|
|
117
|
-
/**
|
|
118
|
-
* error event.
|
|
119
|
-
* @event ModbusTCPServer#error
|
|
120
|
-
*/
|
|
121
|
-
this.emit('error', err);
|
|
122
|
-
}.bind(this);
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Event response
|
|
126
|
-
* Emited when response is send to master
|
|
127
|
-
* @fires ModbusTCPServer#response
|
|
128
|
-
*/
|
|
129
|
-
this.tcpServer.onWrite = function EmitResponse(resp){
|
|
130
|
-
/**
|
|
131
|
-
* response event.
|
|
132
|
-
* @event ModbusTCPServer#response
|
|
133
|
-
*/
|
|
134
|
-
this.emit('response', resp);
|
|
135
|
-
}.bind(this);
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Event client disconnect
|
|
139
|
-
* Emited when client send fin packet
|
|
140
|
-
* @fires ModbusTCPServer#client-disconnect
|
|
141
|
-
*/
|
|
142
|
-
this.tcpServer.onClientEnd = function EmitClientDisconnect(socket){
|
|
143
|
-
/**
|
|
144
|
-
* client-disconnect event.
|
|
145
|
-
* @event ModbusTCPServer#client-disconnect
|
|
146
|
-
*/
|
|
147
|
-
this.emit('client-disconnect',socket);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* port
|
|
152
|
-
* @type {number}
|
|
153
|
-
* @public
|
|
154
|
-
*/
|
|
155
|
-
Object.defineProperty(self, 'port', {
|
|
156
|
-
get : function(){
|
|
157
|
-
return self.tcpServer.port;
|
|
158
|
-
},
|
|
159
|
-
set : function(p){
|
|
160
|
-
self.tcpServer.port = p;
|
|
161
|
-
}
|
|
162
|
-
})
|
|
163
|
-
this.port = p;
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* mode
|
|
169
|
-
* @type {string}
|
|
170
|
-
*/
|
|
171
|
-
this.mode = mode;
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* listening status
|
|
175
|
-
* @type {bool}
|
|
176
|
-
* @public
|
|
177
|
-
*/
|
|
178
|
-
Object.defineProperty(self, 'isListening',{
|
|
179
|
-
get: function(){
|
|
180
|
-
return self.tcpServer.isListening;
|
|
181
|
-
}
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* max client
|
|
186
|
-
* @type {number}
|
|
187
|
-
* @public
|
|
188
|
-
*/
|
|
189
|
-
Object.defineProperty(self, 'maxConnections',{
|
|
190
|
-
get: function(){
|
|
191
|
-
return self.tcpServer.maxConnections;
|
|
192
|
-
},
|
|
193
|
-
set: function(max){
|
|
194
|
-
self.tcpServer.maxConnections = max;
|
|
195
|
-
}
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
//Sellando el tcpServer
|
|
199
|
-
Object.defineProperty(self, 'tcpServer', {
|
|
200
|
-
enumerable:false,
|
|
201
|
-
writable:false,
|
|
202
|
-
configurable:false
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Function to start the server
|
|
209
|
-
*/
|
|
210
|
-
Start(){
|
|
211
|
-
this.tcpServer.Start();
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Function to stop the server
|
|
216
|
-
*/
|
|
217
|
-
Stop(){
|
|
218
|
-
this.tcpServer.Stop();
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Function to execute when data are recive
|
|
223
|
-
* @param {Buffer} aduBuffer frame received by server
|
|
224
|
-
* @return {Buffer} response;
|
|
225
|
-
* @fires ModbusTCPServer#indication {Buffer}
|
|
226
|
-
*/
|
|
227
|
-
ProcessModbusIndication(aduBuffer){
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* indication event.
|
|
231
|
-
* @event ModbusTCPServer#indication
|
|
232
|
-
*/
|
|
233
|
-
this.emit('indication', aduBuffer);
|
|
234
|
-
|
|
235
|
-
let ADU;
|
|
236
|
-
var indicationADU;
|
|
237
|
-
|
|
238
|
-
switch (this.mode){
|
|
239
|
-
case 'rtu':
|
|
240
|
-
ADU = RTU_ADU;
|
|
241
|
-
break;
|
|
242
|
-
case 'ascii':
|
|
243
|
-
ADU = ASCII_ADU;
|
|
244
|
-
break;
|
|
245
|
-
case 'aut':
|
|
246
|
-
(ASCII_ADU.isAsciiAdu(aduBuffer)) ? ADU = ASCII_ADU : ADU = RTU_ADU;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
indicationADU = new ADU(aduBuffer);
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
//checking adu
|
|
253
|
-
if (this.AnalizeADU(indicationADU)){
|
|
254
|
-
return Buffer.alloc(0);
|
|
255
|
-
}
|
|
256
|
-
else{
|
|
257
|
-
//adu ok
|
|
258
|
-
indicationADU.ParseBuffer();
|
|
259
|
-
//creando la respuesta
|
|
260
|
-
var responsePDU = this.BuildResponse(indicationADU.pdu);
|
|
261
|
-
|
|
262
|
-
if(indicationADU.address == 0){
|
|
263
|
-
//broadcast no response
|
|
264
|
-
return Buffer.alloc(0);
|
|
265
|
-
}
|
|
266
|
-
else{
|
|
267
|
-
//response
|
|
268
|
-
if(responsePDU != null){
|
|
269
|
-
var modbusResponse = new ADU();
|
|
270
|
-
modbusResponse.address = indicationADU.address;
|
|
271
|
-
modbusResponse.pdu = responsePDU;
|
|
272
|
-
modbusResponse.MakeBuffer();
|
|
273
|
-
|
|
274
|
-
return modbusResponse.aduBuffer;
|
|
275
|
-
}
|
|
276
|
-
else{
|
|
277
|
-
return Buffer.alloc(0);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Make the response modbus tcp header
|
|
287
|
-
* @param {buffer} adu frame off modbus indication
|
|
288
|
-
* @return {number} error code. 1- error, 0-no errror
|
|
289
|
-
* @fires ModbusTCPServer#error {object}
|
|
290
|
-
*/
|
|
291
|
-
AnalizeADU(adu){
|
|
292
|
-
try{
|
|
293
|
-
adu.ParseBuffer();
|
|
294
|
-
|
|
295
|
-
if ((adu.address != this.modbusAddress & adu.address != 0) | adu.address > 247){
|
|
296
|
-
//ignore the frame if address missmatch
|
|
297
|
-
return 1;
|
|
298
|
-
}
|
|
299
|
-
else{
|
|
300
|
-
return 0;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
catch(e){
|
|
304
|
-
this.emit('error', e);
|
|
305
|
-
return 1;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
module.exports = ModbusSTCPServer;
|