node-red-contrib-modbus-tcp-full-avd 1.0.0 → 1.1.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/README.md +143 -143
- package/modbus-tcp.html +16 -0
- package/modbus-tcp.js +5 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,26 +1,32 @@
|
|
|
1
1
|
# node-red-contrib-modbus-tcp-full-avd
|
|
2
2
|
|
|
3
|
-
Volledige MODBUS TCP node voor Node-RED met ondersteuning voor alle MODBUS functies en het volledige adresbereik (0-65535).
|
|
3
|
+
Volledige MODBUS TCP node voor Node-RED met ondersteuning voor alle MODBUS functies en het volledige adresbereik (0-65535). Node-naam bevat initialen AVD voor unieke herkenbaarheid.
|
|
4
|
+
|
|
5
|
+
**Versie:** 1.1.0
|
|
4
6
|
|
|
5
7
|
## Features
|
|
6
8
|
|
|
7
|
-
- ✅ **TCP Client en Server modes**
|
|
8
|
-
- ✅ **MODBUS Client en Server modes**
|
|
9
|
-
- ✅ **Alle MODBUS functies**
|
|
10
|
-
- ✅ **Volledige adresbereik**
|
|
11
|
-
- ✅ **Automatische reconnect**
|
|
12
|
-
- ✅ **Retry mechanisme**
|
|
13
|
-
- ✅ **Exception handling**
|
|
9
|
+
- ✅ **TCP Client en Server modes** – Verbind als client of luister als server
|
|
10
|
+
- ✅ **MODBUS Client en Server modes** – Verzend requests of reageer op requests
|
|
11
|
+
- ✅ **Alle MODBUS functies** – Ondersteuning voor functie codes 01, 02, 03, 04, 05, 06, 15, 16
|
|
12
|
+
- ✅ **Volledige adresbereik** – 0-65535 voor coils, discrete inputs, holding registers en input registers
|
|
13
|
+
- ✅ **Automatische reconnect** – Herverbind automatisch bij verbindingsverlies
|
|
14
|
+
- ✅ **Retry mechanisme** – Configureerbare retries bij fouten
|
|
15
|
+
- ✅ **Exception handling** – Ondersteuning voor MODBUS exception codes
|
|
16
|
+
- ✅ **Dataweergave** – Toon registerdata in node-status en/of debug panel
|
|
17
|
+
- ✅ **Testdata (Server)** – Vul registers automatisch of handmatig met testdata (incrementing, random, sine, square, alternating)
|
|
18
|
+
- ✅ **Speciale acties** – `readData`, `showData`, `generateTestData` via message
|
|
19
|
+
- ✅ **Accept Any Unit ID (Server)** – Optioneel accepteren van elke Unit ID
|
|
14
20
|
|
|
15
21
|
## Installatie
|
|
16
22
|
|
|
17
23
|
### Via Node-RED Palette Manager
|
|
18
24
|
|
|
19
25
|
1. Open Node-RED
|
|
20
|
-
2. Ga naar Menu → Manage palette
|
|
21
|
-
3. Klik op
|
|
22
|
-
4. Zoek naar
|
|
23
|
-
5. Klik op
|
|
26
|
+
2. Ga naar **Menu** → **Manage palette**
|
|
27
|
+
3. Klik op de **Install** tab
|
|
28
|
+
4. Zoek naar **node-red-contrib-modbus-tcp-full-avd**
|
|
29
|
+
5. Klik op **Install**
|
|
24
30
|
|
|
25
31
|
### Via NPM
|
|
26
32
|
|
|
@@ -28,193 +34,176 @@ Volledige MODBUS TCP node voor Node-RED met ondersteuning voor alle MODBUS funct
|
|
|
28
34
|
npm install node-red-contrib-modbus-tcp-full-avd
|
|
29
35
|
```
|
|
30
36
|
|
|
31
|
-
###
|
|
37
|
+
### Via upload (.tgz)
|
|
38
|
+
|
|
39
|
+
1. Download of maak het package: `npm pack` (creëert `node-red-contrib-modbus-tcp-full-avd-1.1.0.tgz`)
|
|
40
|
+
2. In Node-RED: **Menu** → **Manage palette** → **Install** tab → **upload**
|
|
41
|
+
3. Selecteer het `.tgz` bestand en wacht op installatie
|
|
42
|
+
4. Herstart Node-RED indien nodig
|
|
43
|
+
|
|
44
|
+
### Handmatige installatie
|
|
32
45
|
|
|
33
|
-
1.
|
|
34
|
-
2.
|
|
35
|
-
3.
|
|
36
|
-
4. Herstart Node-RED
|
|
46
|
+
1. Kopieer de package naar `~/.node-red/node_modules/node-red-contrib-modbus-tcp-full-avd`
|
|
47
|
+
2. Voer uit: `npm install` in die directory
|
|
48
|
+
3. Herstart Node-RED
|
|
37
49
|
|
|
38
50
|
## Gebruik
|
|
39
51
|
|
|
40
|
-
### TCP Client + MODBUS Client
|
|
52
|
+
### TCP Client + MODBUS Client
|
|
41
53
|
|
|
42
|
-
|
|
54
|
+
Gebruik om data te lezen/schrijven van een MODBUS TCP server.
|
|
43
55
|
|
|
44
|
-
|
|
45
|
-
- **TCP Mode**: Client
|
|
46
|
-
- **Host**: IP-adres van de MODBUS server
|
|
47
|
-
- **Port**: Poort van de MODBUS server (standaard 502)
|
|
48
|
-
- **MODBUS Mode**: Client
|
|
49
|
-
- **Unit ID**: MODBUS Unit ID (standaard 1)
|
|
56
|
+
**Configuratie:** TCP Mode = Client, Host = IP van server, Port = 502, MODBUS Mode = Client, Unit ID = 1.
|
|
50
57
|
|
|
51
|
-
####
|
|
58
|
+
#### Read Holding Registers
|
|
52
59
|
|
|
53
60
|
```javascript
|
|
54
|
-
msg = {
|
|
55
|
-
function: 3,
|
|
56
|
-
address: 0,
|
|
57
|
-
quantity: 10
|
|
58
|
-
}
|
|
61
|
+
msg.payload = { function: 3, address: 0, quantity: 10 };
|
|
59
62
|
```
|
|
60
63
|
|
|
61
|
-
####
|
|
64
|
+
#### Write Single Register
|
|
62
65
|
|
|
63
66
|
```javascript
|
|
64
|
-
msg = {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
msg.payload = { function: 6, address: 0, value: 1234 };
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### Write Multiple Coils
|
|
71
|
+
|
|
72
|
+
```javascript
|
|
73
|
+
msg.payload = { function: 15, address: 0, values: [true, false, true, false] };
|
|
69
74
|
```
|
|
70
75
|
|
|
71
|
-
####
|
|
76
|
+
#### Lees en toon data (actie readData)
|
|
72
77
|
|
|
73
78
|
```javascript
|
|
74
|
-
msg = {
|
|
75
|
-
|
|
79
|
+
msg.payload = {
|
|
80
|
+
action: "readData",
|
|
81
|
+
readType: "holdingRegisters", // coils, discreteInputs, holdingRegisters, inputRegisters
|
|
76
82
|
address: 0,
|
|
77
|
-
|
|
78
|
-
}
|
|
83
|
+
quantity: 10
|
|
84
|
+
};
|
|
79
85
|
```
|
|
80
86
|
|
|
81
87
|
### TCP Server + MODBUS Server
|
|
82
88
|
|
|
83
|
-
|
|
89
|
+
Gebruik om MODBUS data aan te bieden aan clients.
|
|
84
90
|
|
|
85
|
-
|
|
86
|
-
- **TCP Mode**: Server
|
|
87
|
-
- **Port**: Poort om op te luisteren (standaard 502)
|
|
88
|
-
- **MODBUS Mode**: Server
|
|
89
|
-
- **Unit ID**: MODBUS Unit ID (standaard 1)
|
|
90
|
-
- **Max Connections**: Maximum aantal gelijktijdige verbindingen
|
|
91
|
+
**Configuratie:** TCP Mode = Server, Port = 502, MODBUS Mode = Server, Unit ID = 1. Optioneel: **Accept Any Unit ID** om elke Unit ID te accepteren.
|
|
91
92
|
|
|
92
|
-
#### Data
|
|
93
|
+
#### Data bijwerken
|
|
93
94
|
|
|
94
95
|
```javascript
|
|
95
|
-
msg = {
|
|
96
|
+
msg.payload = {
|
|
96
97
|
type: "holdingRegisters", // coils, discreteInputs, holdingRegisters, inputRegisters
|
|
97
98
|
address: 0,
|
|
98
|
-
value: 1234
|
|
99
|
-
}
|
|
99
|
+
value: 1234
|
|
100
|
+
};
|
|
100
101
|
```
|
|
101
102
|
|
|
102
|
-
|
|
103
|
+
Meerdere waarden:
|
|
103
104
|
|
|
104
105
|
```javascript
|
|
105
|
-
msg = {
|
|
106
|
-
|
|
106
|
+
msg.payload = { type: "holdingRegisters", address: 0, values: [1, 2, 3, 4, 5] };
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### Toon alle registerdata (actie showData)
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
msg.payload = { action: "showData" };
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### Genereer testdata (actie generateTestData)
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
msg.payload = {
|
|
119
|
+
action: "generateTestData",
|
|
120
|
+
pattern: "incrementing", // incrementing, random, sine, square, alternating
|
|
121
|
+
dataType: "holdingRegisters", // coils, discreteInputs, holdingRegisters, inputRegisters
|
|
107
122
|
address: 0,
|
|
108
|
-
|
|
109
|
-
}
|
|
123
|
+
quantity: 100
|
|
124
|
+
};
|
|
110
125
|
```
|
|
111
126
|
|
|
112
|
-
##
|
|
127
|
+
## Configuratie-opties
|
|
113
128
|
|
|
114
|
-
|
|
115
|
-
|---------|------|--------------|--------|
|
|
116
|
-
| Read Coils | 01 | Leest discrete outputs | ✅ |
|
|
117
|
-
| Read Discrete Inputs | 02 | Leest discrete inputs | ✅ |
|
|
118
|
-
| Read Holding Registers | 03 | Leest holding registers | ✅ |
|
|
119
|
-
| Read Input Registers | 04 | Leest input registers | ✅ |
|
|
120
|
-
| Write Single Coil | 05 | Schrijft één coil | ✅ |
|
|
121
|
-
| Write Single Register | 06 | Schrijft één register | ✅ |
|
|
122
|
-
| Write Multiple Coils | 15 | Schrijft meerdere coils | ✅ |
|
|
123
|
-
| Write Multiple Registers | 16 | Schrijft meerdere registers | ✅ |
|
|
129
|
+
### TCP
|
|
124
130
|
|
|
125
|
-
|
|
131
|
+
- **TCP Mode** – Client of Server
|
|
132
|
+
- **Host** – IP-adres (alleen bij Client)
|
|
133
|
+
- **Port** – Standaard 502
|
|
134
|
+
- **Reconnect Interval** – Interval bij verbindingsverlies (ms)
|
|
135
|
+
- **Connection Timeout** – Timeout verbinding (ms)
|
|
136
|
+
- **Max Connections** – Max. verbindingen (alleen Server)
|
|
126
137
|
|
|
127
|
-
###
|
|
138
|
+
### MODBUS
|
|
128
139
|
|
|
129
|
-
- **
|
|
130
|
-
- **
|
|
131
|
-
- **
|
|
132
|
-
- **
|
|
133
|
-
- **
|
|
134
|
-
- **Max Connections**: Maximum aantal verbindingen (alleen Server mode)
|
|
140
|
+
- **MODBUS Mode** – Client of Server
|
|
141
|
+
- **Unit ID** – 0–255
|
|
142
|
+
- **Accept Any Unit ID** – (alleen Server) Accepteer elke Unit ID
|
|
143
|
+
- **Byte Order** – Big Endian of Little Endian
|
|
144
|
+
- **Address Offset** – 0 (0-based) of 1 (1-based)
|
|
135
145
|
|
|
136
|
-
###
|
|
146
|
+
### Client
|
|
137
147
|
|
|
138
|
-
- **
|
|
139
|
-
- **
|
|
140
|
-
- **
|
|
141
|
-
- **Address Offset**: 0 (0-based) of 1 (1-based addressing)
|
|
148
|
+
- **Request Timeout** – Timeout per request (ms)
|
|
149
|
+
- **Retry Count** – Aantal retries
|
|
150
|
+
- **Retry Interval** – Interval tussen retries (ms)
|
|
142
151
|
|
|
143
|
-
###
|
|
152
|
+
### Dataweergave
|
|
144
153
|
|
|
145
|
-
- **
|
|
146
|
-
- **
|
|
147
|
-
- **Retry Interval**: Interval tussen retries (ms)
|
|
154
|
+
- **Toon Data in Status** – Laatste waarden in node-status
|
|
155
|
+
- **Debug Mode** – Log data naar debug panel
|
|
148
156
|
|
|
149
|
-
|
|
157
|
+
### Testdata (alleen Server)
|
|
150
158
|
|
|
151
|
-
|
|
159
|
+
- **Genereer Test Data bij Start** – Vul bij start automatisch holding- en inputregisters (0–99)
|
|
160
|
+
- **Test Data Patroon** – incrementing, random, sine, square, alternating
|
|
152
161
|
|
|
153
|
-
|
|
154
|
-
{
|
|
155
|
-
function: 1-24, // MODBUS functie code
|
|
156
|
-
address: 0, // Start adres
|
|
157
|
-
quantity: 10, // Aantal registers/coils (voor read)
|
|
158
|
-
value: 123, // Single value (voor write)
|
|
159
|
-
values: [1, 2, 3], // Multiple values (voor write)
|
|
160
|
-
unitId: 1, // Optioneel: Unit ID override
|
|
161
|
-
timeout: 5000 // Optioneel: Timeout override
|
|
162
|
-
}
|
|
163
|
-
```
|
|
162
|
+
## Ondersteunde MODBUS-functies
|
|
164
163
|
|
|
165
|
-
|
|
164
|
+
| Functie | Code | Beschrijving |
|
|
165
|
+
|----------------------------|------|---------------------------|
|
|
166
|
+
| Read Coils | 01 | Leest discrete outputs |
|
|
167
|
+
| Read Discrete Inputs | 02 | Leest discrete inputs |
|
|
168
|
+
| Read Holding Registers | 03 | Leest holding registers |
|
|
169
|
+
| Read Input Registers | 04 | Leest input registers |
|
|
170
|
+
| Write Single Coil | 05 | Schrijft één coil |
|
|
171
|
+
| Write Single Register | 06 | Schrijft één register |
|
|
172
|
+
| Write Multiple Coils | 15 | Schrijft meerdere coils |
|
|
173
|
+
| Write Multiple Registers | 16 | Schrijft meerdere registers |
|
|
166
174
|
|
|
167
|
-
|
|
168
|
-
{
|
|
169
|
-
function: 3, // MODBUS functie code
|
|
170
|
-
address: 0, // Start adres
|
|
171
|
-
quantity: 10, // Aantal gelezen items
|
|
172
|
-
data: [1, 2, 3, ...], // Gelezen data array
|
|
173
|
-
timestamp: Date, // Response timestamp
|
|
174
|
-
responseTime: 45 // Response tijd in ms
|
|
175
|
-
}
|
|
176
|
-
```
|
|
175
|
+
## Input/Output-formaat
|
|
177
176
|
|
|
178
|
-
###
|
|
177
|
+
### Input (Client – normale requests)
|
|
179
178
|
|
|
180
|
-
|
|
181
|
-
{
|
|
182
|
-
error: {
|
|
183
|
-
code: 2, // Exception code
|
|
184
|
-
message: "Illegal Data Address",
|
|
185
|
-
function: 3, // Requested functie
|
|
186
|
-
address: 0 // Requested adres
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
```
|
|
179
|
+
`msg.payload` of top-level: `function`, `address`, `quantity` (read), `value` of `values` (write), optioneel `unitId`, `timeout`.
|
|
190
180
|
|
|
191
|
-
|
|
181
|
+
### Output (Client – succes)
|
|
192
182
|
|
|
193
|
-
|
|
194
|
-
- **Discrete Inputs**: 0 - 65535
|
|
195
|
-
- **Holding Registers**: 0 - 65535
|
|
196
|
-
- **Input Registers**: 0 - 65535
|
|
183
|
+
`msg.payload`: `function`, `address`, `quantity`, `data` (array), `timestamp`, `responseTime`.
|
|
197
184
|
|
|
198
|
-
|
|
185
|
+
### Output (fout)
|
|
199
186
|
|
|
200
|
-
|
|
187
|
+
`msg.error`: `code`, `message`, `function`, `address`.
|
|
201
188
|
|
|
202
|
-
|
|
203
|
-
- Controleer firewall instellingen
|
|
204
|
-
- Controleer of de MODBUS server actief is
|
|
189
|
+
### Speciale acties – output
|
|
205
190
|
|
|
206
|
-
|
|
191
|
+
- **readData** – `payload.action`, `payload.type`, `payload.address`, `payload.quantity`, `payload.data`, `payload.dataMap`
|
|
192
|
+
- **showData** – `payload.action`, `payload.summary` (per type: coils, discreteInputs, holdingRegisters, inputRegisters)
|
|
193
|
+
- **generateTestData** – `payload.action`, `payload.result` (pattern, dataType, startAddress, quantity, values sample)
|
|
194
|
+
|
|
195
|
+
## Adresbereik
|
|
207
196
|
|
|
208
|
-
-
|
|
209
|
-
-
|
|
210
|
-
-
|
|
197
|
+
- Coils: 0–65535
|
|
198
|
+
- Discrete Inputs: 0–65535
|
|
199
|
+
- Holding Registers: 0–65535
|
|
200
|
+
- Input Registers: 0–65535
|
|
211
201
|
|
|
212
|
-
|
|
202
|
+
## Troubleshooting
|
|
213
203
|
|
|
214
|
-
- **
|
|
215
|
-
- **
|
|
216
|
-
- **03
|
|
217
|
-
- **04**: Server Device Failure - Server fout
|
|
204
|
+
- **Geen verbinding** – Controleer host, poort en firewall; controleer of de MODBUS server draait.
|
|
205
|
+
- **Timeout** – Verhoog Request Timeout; controleer netwerk en server.
|
|
206
|
+
- **Exception 01/02/03/04** – Controleer functiecode, adres en waarden; controleer Unit ID (of zet Accept Any Unit ID aan op de server).
|
|
218
207
|
|
|
219
208
|
## Licentie
|
|
220
209
|
|
|
@@ -222,8 +211,19 @@ MIT
|
|
|
222
211
|
|
|
223
212
|
## Auteur
|
|
224
213
|
|
|
225
|
-
ModBUSTester Project
|
|
214
|
+
ModBUSTester Project (AVD)
|
|
215
|
+
|
|
216
|
+
## Changelog
|
|
217
|
+
|
|
218
|
+
### 1.1.0
|
|
219
|
+
|
|
220
|
+
- Dataweergave: Toon Data in Status, Debug Mode
|
|
221
|
+
- Server: testdata (automatisch bij start + actie generateTestData), patronen: incrementing, random, sine, square, alternating
|
|
222
|
+
- Speciale acties: readData, showData, generateTestData
|
|
223
|
+
- Server: optie Accept Any Unit ID
|
|
224
|
+
- Bufferfix voor Write Single Register/Coil (PDU 5 bytes)
|
|
225
|
+
- Response-buffering voor incomplete TCP-frames
|
|
226
226
|
|
|
227
|
-
|
|
227
|
+
### 1.0.0
|
|
228
228
|
|
|
229
|
-
|
|
229
|
+
- Eerste release: MODBUS TCP client/server, alle basis functies 01–16, volledig adresbereik
|
package/modbus-tcp.html
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
maxConnections: { value: 10, required: true, validate: RED.validators.number() },
|
|
13
13
|
modbusMode: { value: "client", required: true },
|
|
14
14
|
unitId: { value: 1, required: true, validate: function(v) { return v >= 0 && v <= 255; } },
|
|
15
|
+
acceptAnyUnitId: { value: false, required: false },
|
|
15
16
|
byteOrder: { value: "bigEndian", required: true },
|
|
16
17
|
addressOffset: { value: 0, required: true, validate: RED.validators.number() },
|
|
17
18
|
requestTimeout: { value: 5000, required: true, validate: RED.validators.number() },
|
|
@@ -33,6 +34,13 @@
|
|
|
33
34
|
},
|
|
34
35
|
oneditprepare: function() {
|
|
35
36
|
// Show/hide fields based on TCP mode
|
|
37
|
+
function updateServerOnlyVisibility() {
|
|
38
|
+
var tcpMode = $("#node-input-tcpMode").val();
|
|
39
|
+
var modbusMode = $("#node-input-modbusMode").val();
|
|
40
|
+
var isServer = (tcpMode === "server" && modbusMode === "server");
|
|
41
|
+
$("#node-input-acceptAnyUnitId-row").toggle(isServer);
|
|
42
|
+
}
|
|
43
|
+
|
|
36
44
|
$("#node-input-tcpMode").on("change", function() {
|
|
37
45
|
var tcpMode = $(this).val();
|
|
38
46
|
if (tcpMode === "client") {
|
|
@@ -42,6 +50,7 @@
|
|
|
42
50
|
$("#node-input-host-row").hide();
|
|
43
51
|
$("#node-input-maxConnections-row").show();
|
|
44
52
|
}
|
|
53
|
+
updateServerOnlyVisibility();
|
|
45
54
|
});
|
|
46
55
|
|
|
47
56
|
// Show/hide fields based on MODBUS mode
|
|
@@ -56,6 +65,7 @@
|
|
|
56
65
|
$("#node-input-retryCount-row").hide();
|
|
57
66
|
$("#node-input-retryInterval-row").hide();
|
|
58
67
|
}
|
|
68
|
+
updateServerOnlyVisibility();
|
|
59
69
|
});
|
|
60
70
|
|
|
61
71
|
// Trigger initial visibility
|
|
@@ -125,6 +135,12 @@
|
|
|
125
135
|
<input type="number" id="node-input-unitId" placeholder="1" min="0" max="255">
|
|
126
136
|
</div>
|
|
127
137
|
|
|
138
|
+
<div class="form-row" id="node-input-acceptAnyUnitId-row">
|
|
139
|
+
<label for="node-input-acceptAnyUnitId"><i class="fa fa-check-circle"></i> Alle Unit IDs accepteren</label>
|
|
140
|
+
<input type="checkbox" id="node-input-acceptAnyUnitId" style="width: auto; vertical-align: top;">
|
|
141
|
+
<label for="node-input-acceptAnyUnitId" style="width: 70%; display: inline-block;">(Server) Accepteer elk Unit ID; anders alleen geconfigureerd Unit ID en 0</label>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
128
144
|
<div class="form-row">
|
|
129
145
|
<label for="node-input-byteOrder"><i class="fa fa-sort"></i> Byte Order</label>
|
|
130
146
|
<select id="node-input-byteOrder">
|
package/modbus-tcp.js
CHANGED
|
@@ -379,7 +379,7 @@ module.exports = function(RED) {
|
|
|
379
379
|
|
|
380
380
|
socket.on('data', (data) => {
|
|
381
381
|
buffer = Buffer.concat([buffer, data]);
|
|
382
|
-
this.processRequest(socket, buffer, clientId);
|
|
382
|
+
buffer = this.processRequest(socket, buffer, clientId);
|
|
383
383
|
});
|
|
384
384
|
|
|
385
385
|
socket.on('error', (err) => {
|
|
@@ -410,7 +410,7 @@ module.exports = function(RED) {
|
|
|
410
410
|
const expectedLength = 7 + mbap.length - 1; // -1 because unitId is included in length
|
|
411
411
|
|
|
412
412
|
if (buffer.length < expectedLength) {
|
|
413
|
-
return; // Wait for more data
|
|
413
|
+
return buffer; // Wait for more data
|
|
414
414
|
}
|
|
415
415
|
|
|
416
416
|
const pdu = buffer.slice(7, expectedLength);
|
|
@@ -424,10 +424,11 @@ module.exports = function(RED) {
|
|
|
424
424
|
this.node.error(`Error processing request: ${err.message}`);
|
|
425
425
|
}
|
|
426
426
|
}
|
|
427
|
+
return buffer;
|
|
427
428
|
}
|
|
428
429
|
|
|
429
430
|
handleModbusRequest(pdu, unitId) {
|
|
430
|
-
if (unitId !== this.config.unitId && unitId !== 0) {
|
|
431
|
+
if (!this.config.acceptAnyUnitId && unitId !== this.config.unitId && unitId !== 0) {
|
|
431
432
|
return this.buildExceptionResponse(pdu[0], 0x0A); // Gateway Target Device Failed
|
|
432
433
|
}
|
|
433
434
|
|
|
@@ -807,6 +808,7 @@ module.exports = function(RED) {
|
|
|
807
808
|
maxConnections: config.maxConnections || 10,
|
|
808
809
|
modbusMode: config.modbusMode || "client",
|
|
809
810
|
unitId: config.unitId || 1,
|
|
811
|
+
acceptAnyUnitId: config.acceptAnyUnitId === true,
|
|
810
812
|
byteOrder: config.byteOrder || "bigEndian",
|
|
811
813
|
addressOffset: config.addressOffset || 0,
|
|
812
814
|
requestTimeout: config.requestTimeout || 5000,
|
package/package.json
CHANGED