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 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** - Verbind als client of luister als server
8
- - ✅ **MODBUS Client en Server modes** - Verzend requests of reageer op requests
9
- - ✅ **Alle MODBUS functies** - Ondersteuning voor functie codes 01-24
10
- - ✅ **Volledige adresbereik** - 0-65535 voor alle data types
11
- - ✅ **Automatische reconnect** - Herverbind automatisch bij verbindingsverlies
12
- - ✅ **Retry mechanisme** - Configureerbare retries bij fouten
13
- - ✅ **Exception handling** - Volledige ondersteuning voor MODBUS exception codes
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 "Install" tab
22
- 4. Zoek naar "node-red-contrib-modbus-tcp-full-avd"
23
- 5. Klik op "Install"
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
- ### Handmatige Installatie
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. Download of clone deze repository
34
- 2. Navigeer naar de Node-RED user directory (meestal `~/.node-red`)
35
- 3. Kopieer de bestanden naar `~/.node-red/node_modules/node-red-contrib-modbus-tcp-full-avd`
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 (Meest Voorkomend)
52
+ ### TCP Client + MODBUS Client
41
53
 
42
- Deze combinatie wordt gebruikt om data te lezen/schrijven van een MODBUS TCP server.
54
+ Gebruik om data te lezen/schrijven van een MODBUS TCP server.
43
55
 
44
- #### Configuratie
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
- #### Voorbeeld: Read Holding Registers
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
- #### Voorbeeld: Write Single Register
64
+ #### Write Single Register
62
65
 
63
66
  ```javascript
64
- msg = {
65
- function: 6,
66
- address: 0,
67
- value: 1234
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
- #### Voorbeeld: Write Multiple Coils
76
+ #### Lees en toon data (actie readData)
72
77
 
73
78
  ```javascript
74
- msg = {
75
- function: 15,
79
+ msg.payload = {
80
+ action: "readData",
81
+ readType: "holdingRegisters", // coils, discreteInputs, holdingRegisters, inputRegisters
76
82
  address: 0,
77
- values: [true, false, true, false]
78
- }
83
+ quantity: 10
84
+ };
79
85
  ```
80
86
 
81
87
  ### TCP Server + MODBUS Server
82
88
 
83
- Deze combinatie wordt gebruikt om MODBUS data aan te bieden aan clients.
89
+ Gebruik om MODBUS data aan te bieden aan clients.
84
90
 
85
- #### Configuratie
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 Update
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 // Single value
99
- }
99
+ value: 1234
100
+ };
100
101
  ```
101
102
 
102
- Of voor meerdere waarden:
103
+ Meerdere waarden:
103
104
 
104
105
  ```javascript
105
- msg = {
106
- type: "holdingRegisters",
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
- values: [1, 2, 3, 4, 5] // Array van waarden
109
- }
123
+ quantity: 100
124
+ };
110
125
  ```
111
126
 
112
- ## Ondersteunde MODBUS Functies
127
+ ## Configuratie-opties
113
128
 
114
- | Functie | Code | Beschrijving | Status |
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
- ## Configuratie Opties
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
- ### TCP Instellingen
138
+ ### MODBUS
128
139
 
129
- - **TCP Mode**: Client of Server
130
- - **Host**: IP-adres (alleen Client mode)
131
- - **Port**: TCP poort (standaard 502)
132
- - **Reconnect Interval**: Interval voor reconnect bij verbindingsverlies (ms)
133
- - **Connection Timeout**: Timeout voor verbinding (ms)
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
- ### MODBUS Instellingen
146
+ ### Client
137
147
 
138
- - **MODBUS Mode**: Client of Server
139
- - **Unit ID**: MODBUS Unit ID (0-255)
140
- - **Byte Order**: Big Endian of Little Endian
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
- ### Client Instellingen
152
+ ### Dataweergave
144
153
 
145
- - **Request Timeout**: Timeout voor requests (ms)
146
- - **Retry Count**: Aantal retries bij fouten
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
- ## Input/Output Format
157
+ ### Testdata (alleen Server)
150
158
 
151
- ### Input (Client Mode)
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
- ```javascript
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
- ### Output (Client Mode)
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
- ```javascript
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
- ### Error Output
177
+ ### Input (Client – normale requests)
179
178
 
180
- ```javascript
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
- ## Adresbereik
181
+ ### Output (Client – succes)
192
182
 
193
- - **Coils**: 0 - 65535
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
- ## Troubleshooting
185
+ ### Output (fout)
199
186
 
200
- ### Verbindingsproblemen
187
+ `msg.error`: `code`, `message`, `function`, `address`.
201
188
 
202
- - Controleer of de host en poort correct zijn geconfigureerd
203
- - Controleer firewall instellingen
204
- - Controleer of de MODBUS server actief is
189
+ ### Speciale acties output
205
190
 
206
- ### Timeout Errors
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
- - Verhoog de request timeout waarde
209
- - Controleer netwerk latency
210
- - Controleer of de MODBUS server reageert
197
+ - Coils: 0–65535
198
+ - Discrete Inputs: 0–65535
199
+ - Holding Registers: 0–65535
200
+ - Input Registers: 0–65535
211
201
 
212
- ### Exception Codes
202
+ ## Troubleshooting
213
203
 
214
- - **01**: Illegal Function - Functie code niet ondersteund
215
- - **02**: Illegal Data Address - Adres buiten bereik
216
- - **03**: Illegal Data Value - Ongeldige waarde
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
- ## Versie
227
+ ### 1.0.0
228
228
 
229
- 1.0.0
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-red-contrib-modbus-tcp-full-avd",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Volledige MODBUS TCP node voor Node-RED met ondersteuning voor alle functies en adresbereik",
5
5
  "main": "modbus-tcp.js",
6
6
  "scripts": {