node-red-contrib-modbus-tcp-full-avd 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/README.md ADDED
@@ -0,0 +1,229 @@
1
+ # node-red-contrib-modbus-tcp-full-avd
2
+
3
+ Volledige MODBUS TCP node voor Node-RED met ondersteuning voor alle MODBUS functies en het volledige adresbereik (0-65535).
4
+
5
+ ## Features
6
+
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
14
+
15
+ ## Installatie
16
+
17
+ ### Via Node-RED Palette Manager
18
+
19
+ 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"
24
+
25
+ ### Via NPM
26
+
27
+ ```bash
28
+ npm install node-red-contrib-modbus-tcp-full-avd
29
+ ```
30
+
31
+ ### Handmatige Installatie
32
+
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
37
+
38
+ ## Gebruik
39
+
40
+ ### TCP Client + MODBUS Client (Meest Voorkomend)
41
+
42
+ Deze combinatie wordt gebruikt om data te lezen/schrijven van een MODBUS TCP server.
43
+
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)
50
+
51
+ #### Voorbeeld: Read Holding Registers
52
+
53
+ ```javascript
54
+ msg = {
55
+ function: 3,
56
+ address: 0,
57
+ quantity: 10
58
+ }
59
+ ```
60
+
61
+ #### Voorbeeld: Write Single Register
62
+
63
+ ```javascript
64
+ msg = {
65
+ function: 6,
66
+ address: 0,
67
+ value: 1234
68
+ }
69
+ ```
70
+
71
+ #### Voorbeeld: Write Multiple Coils
72
+
73
+ ```javascript
74
+ msg = {
75
+ function: 15,
76
+ address: 0,
77
+ values: [true, false, true, false]
78
+ }
79
+ ```
80
+
81
+ ### TCP Server + MODBUS Server
82
+
83
+ Deze combinatie wordt gebruikt om MODBUS data aan te bieden aan clients.
84
+
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
+
92
+ #### Data Update
93
+
94
+ ```javascript
95
+ msg = {
96
+ type: "holdingRegisters", // coils, discreteInputs, holdingRegisters, inputRegisters
97
+ address: 0,
98
+ value: 1234 // Single value
99
+ }
100
+ ```
101
+
102
+ Of voor meerdere waarden:
103
+
104
+ ```javascript
105
+ msg = {
106
+ type: "holdingRegisters",
107
+ address: 0,
108
+ values: [1, 2, 3, 4, 5] // Array van waarden
109
+ }
110
+ ```
111
+
112
+ ## Ondersteunde MODBUS Functies
113
+
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 | ✅ |
124
+
125
+ ## Configuratie Opties
126
+
127
+ ### TCP Instellingen
128
+
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)
135
+
136
+ ### MODBUS Instellingen
137
+
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)
142
+
143
+ ### Client Instellingen
144
+
145
+ - **Request Timeout**: Timeout voor requests (ms)
146
+ - **Retry Count**: Aantal retries bij fouten
147
+ - **Retry Interval**: Interval tussen retries (ms)
148
+
149
+ ## Input/Output Format
150
+
151
+ ### Input (Client Mode)
152
+
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
+ ```
164
+
165
+ ### Output (Client Mode)
166
+
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
+ ```
177
+
178
+ ### Error Output
179
+
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
+ ```
190
+
191
+ ## Adresbereik
192
+
193
+ - **Coils**: 0 - 65535
194
+ - **Discrete Inputs**: 0 - 65535
195
+ - **Holding Registers**: 0 - 65535
196
+ - **Input Registers**: 0 - 65535
197
+
198
+ ## Troubleshooting
199
+
200
+ ### Verbindingsproblemen
201
+
202
+ - Controleer of de host en poort correct zijn geconfigureerd
203
+ - Controleer firewall instellingen
204
+ - Controleer of de MODBUS server actief is
205
+
206
+ ### Timeout Errors
207
+
208
+ - Verhoog de request timeout waarde
209
+ - Controleer netwerk latency
210
+ - Controleer of de MODBUS server reageert
211
+
212
+ ### Exception Codes
213
+
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
218
+
219
+ ## Licentie
220
+
221
+ MIT
222
+
223
+ ## Auteur
224
+
225
+ ModBUSTester Project
226
+
227
+ ## Versie
228
+
229
+ 1.0.0
@@ -0,0 +1,312 @@
1
+ <script type="text/javascript">
2
+ RED.nodes.registerType('modbus-tcp-avd', {
3
+ category: 'network',
4
+ color: '#E6E0F8',
5
+ defaults: {
6
+ name: { value: "" },
7
+ tcpMode: { value: "client", required: true },
8
+ host: { value: "127.0.0.1", required: false },
9
+ port: { value: 502, required: true, validate: RED.validators.number() },
10
+ reconnectInterval: { value: 5000, required: true, validate: RED.validators.number() },
11
+ connectionTimeout: { value: 10000, required: true, validate: RED.validators.number() },
12
+ maxConnections: { value: 10, required: true, validate: RED.validators.number() },
13
+ modbusMode: { value: "client", required: true },
14
+ unitId: { value: 1, required: true, validate: function(v) { return v >= 0 && v <= 255; } },
15
+ byteOrder: { value: "bigEndian", required: true },
16
+ addressOffset: { value: 0, required: true, validate: RED.validators.number() },
17
+ requestTimeout: { value: 5000, required: true, validate: RED.validators.number() },
18
+ retryCount: { value: 3, required: true, validate: RED.validators.number() },
19
+ retryInterval: { value: 1000, required: true, validate: RED.validators.number() },
20
+ showData: { value: false, required: false },
21
+ debugMode: { value: false, required: false },
22
+ generateTestData: { value: false, required: false },
23
+ testDataPattern: { value: "incrementing", required: false }
24
+ },
25
+ inputs: 1,
26
+ outputs: 1,
27
+ icon: "bridge.png",
28
+ label: function() {
29
+ return this.name || "modbus-tcp-avd";
30
+ },
31
+ labelStyle: function() {
32
+ return this.name ? "node_label_italic" : "";
33
+ },
34
+ oneditprepare: function() {
35
+ // Show/hide fields based on TCP mode
36
+ $("#node-input-tcpMode").on("change", function() {
37
+ var tcpMode = $(this).val();
38
+ if (tcpMode === "client") {
39
+ $("#node-input-host-row").show();
40
+ $("#node-input-maxConnections-row").hide();
41
+ } else {
42
+ $("#node-input-host-row").hide();
43
+ $("#node-input-maxConnections-row").show();
44
+ }
45
+ });
46
+
47
+ // Show/hide fields based on MODBUS mode
48
+ $("#node-input-modbusMode").on("change", function() {
49
+ var modbusMode = $(this).val();
50
+ if (modbusMode === "client") {
51
+ $("#node-input-requestTimeout-row").show();
52
+ $("#node-input-retryCount-row").show();
53
+ $("#node-input-retryInterval-row").show();
54
+ } else {
55
+ $("#node-input-requestTimeout-row").hide();
56
+ $("#node-input-retryCount-row").hide();
57
+ $("#node-input-retryInterval-row").hide();
58
+ }
59
+ });
60
+
61
+ // Trigger initial visibility
62
+ $("#node-input-tcpMode").trigger("change");
63
+ $("#node-input-modbusMode").trigger("change");
64
+ }
65
+ });
66
+ </script>
67
+
68
+ <script type="text/html" data-template-name="modbus-tcp-avd">
69
+ <div class="form-row">
70
+ <label for="node-input-name"><i class="icon-tag"></i> Naam</label>
71
+ <input type="text" id="node-input-name" placeholder="Naam">
72
+ </div>
73
+
74
+ <div class="form-tips">
75
+ <b>TCP Instellingen</b>
76
+ </div>
77
+
78
+ <div class="form-row">
79
+ <label for="node-input-tcpMode"><i class="fa fa-exchange"></i> TCP Mode</label>
80
+ <select id="node-input-tcpMode">
81
+ <option value="client">Client</option>
82
+ <option value="server">Server</option>
83
+ </select>
84
+ </div>
85
+
86
+ <div class="form-row" id="node-input-host-row">
87
+ <label for="node-input-host"><i class="fa fa-server"></i> Host</label>
88
+ <input type="text" id="node-input-host" placeholder="127.0.0.1">
89
+ </div>
90
+
91
+ <div class="form-row">
92
+ <label for="node-input-port"><i class="fa fa-plug"></i> Poort</label>
93
+ <input type="number" id="node-input-port" placeholder="502" min="1" max="65535">
94
+ </div>
95
+
96
+ <div class="form-row" id="node-input-reconnectInterval-row">
97
+ <label for="node-input-reconnectInterval"><i class="fa fa-refresh"></i> Reconnect Interval (ms)</label>
98
+ <input type="number" id="node-input-reconnectInterval" placeholder="5000" min="1000">
99
+ </div>
100
+
101
+ <div class="form-row" id="node-input-connectionTimeout-row">
102
+ <label for="node-input-connectionTimeout"><i class="fa fa-clock-o"></i> Connection Timeout (ms)</label>
103
+ <input type="number" id="node-input-connectionTimeout" placeholder="10000" min="1000">
104
+ </div>
105
+
106
+ <div class="form-row" id="node-input-maxConnections-row">
107
+ <label for="node-input-maxConnections"><i class="fa fa-users"></i> Max Verbindingen</label>
108
+ <input type="number" id="node-input-maxConnections" placeholder="10" min="1" max="100">
109
+ </div>
110
+
111
+ <div class="form-tips">
112
+ <b>MODBUS Instellingen</b>
113
+ </div>
114
+
115
+ <div class="form-row">
116
+ <label for="node-input-modbusMode"><i class="fa fa-exchange"></i> MODBUS Mode</label>
117
+ <select id="node-input-modbusMode">
118
+ <option value="client">Client</option>
119
+ <option value="server">Server</option>
120
+ </select>
121
+ </div>
122
+
123
+ <div class="form-row">
124
+ <label for="node-input-unitId"><i class="fa fa-id-card"></i> Unit ID</label>
125
+ <input type="number" id="node-input-unitId" placeholder="1" min="0" max="255">
126
+ </div>
127
+
128
+ <div class="form-row">
129
+ <label for="node-input-byteOrder"><i class="fa fa-sort"></i> Byte Order</label>
130
+ <select id="node-input-byteOrder">
131
+ <option value="bigEndian">Big Endian</option>
132
+ <option value="littleEndian">Little Endian</option>
133
+ </select>
134
+ </div>
135
+
136
+ <div class="form-row">
137
+ <label for="node-input-addressOffset"><i class="fa fa-map-marker"></i> Address Offset</label>
138
+ <input type="number" id="node-input-addressOffset" placeholder="0" min="0" max="1">
139
+ <span class="form-tips">0 = 0-based, 1 = 1-based addressing</span>
140
+ </div>
141
+
142
+ <div class="form-tips">
143
+ <b>Client Instellingen</b>
144
+ </div>
145
+
146
+ <div class="form-row" id="node-input-requestTimeout-row">
147
+ <label for="node-input-requestTimeout"><i class="fa fa-hourglass-half"></i> Request Timeout (ms)</label>
148
+ <input type="number" id="node-input-requestTimeout" placeholder="5000" min="1000">
149
+ </div>
150
+
151
+ <div class="form-row" id="node-input-retryCount-row">
152
+ <label for="node-input-retryCount"><i class="fa fa-repeat"></i> Retry Count</label>
153
+ <input type="number" id="node-input-retryCount" placeholder="3" min="0" max="10">
154
+ </div>
155
+
156
+ <div class="form-row" id="node-input-retryInterval-row">
157
+ <label for="node-input-retryInterval"><i class="fa fa-clock-o"></i> Retry Interval (ms)</label>
158
+ <input type="number" id="node-input-retryInterval" placeholder="1000" min="100">
159
+ </div>
160
+
161
+ <div class="form-tips">
162
+ <b>Data Weergave</b>
163
+ </div>
164
+
165
+ <div class="form-row">
166
+ <label for="node-input-showData"><i class="fa fa-eye"></i> Toon Data in Status</label>
167
+ <input type="checkbox" id="node-input-showData" style="width: auto; vertical-align: top;">
168
+ <label for="node-input-showData" style="width: 70%; display: inline-block;">Toon laatste register waarden in node status</label>
169
+ </div>
170
+
171
+ <div class="form-row">
172
+ <label for="node-input-debugMode"><i class="fa fa-bug"></i> Debug Mode</label>
173
+ <input type="checkbox" id="node-input-debugMode" style="width: auto; vertical-align: top;">
174
+ <label for="node-input-debugMode" style="width: 70%; display: inline-block;">Log alle data naar debug panel</label>
175
+ </div>
176
+
177
+ <div class="form-tips" id="node-input-testData-section" style="display: none;">
178
+ <b>Test Data (Server Mode)</b>
179
+ </div>
180
+
181
+ <div class="form-row" id="node-input-generateTestData-row" style="display: none;">
182
+ <label for="node-input-generateTestData"><i class="fa fa-flask"></i> Genereer Test Data bij Start</label>
183
+ <input type="checkbox" id="node-input-generateTestData" style="width: auto; vertical-align: top;">
184
+ <label for="node-input-generateTestData" style="width: 70%; display: inline-block;">Vul registers automatisch met testdata</label>
185
+ </div>
186
+
187
+ <div class="form-row" id="node-input-testDataPattern-row" style="display: none;">
188
+ <label for="node-input-testDataPattern"><i class="fa fa-chart-line"></i> Test Data Patroon</label>
189
+ <select id="node-input-testDataPattern">
190
+ <option value="incrementing">Incrementing (0, 1, 2, 3...)</option>
191
+ <option value="random">Random (0-65535)</option>
192
+ <option value="sine">Sine Wave</option>
193
+ <option value="square">Square Wave</option>
194
+ <option value="alternating">Alternating (0, 1, 0, 1...)</option>
195
+ </select>
196
+ </div>
197
+
198
+ <script type="text/javascript">
199
+ // Show/hide test data options based on MODBUS mode
200
+ $("#node-input-modbusMode").on("change", function() {
201
+ var modbusMode = $(this).val();
202
+ if (modbusMode === "server") {
203
+ $("#node-input-testData-section").show();
204
+ $("#node-input-generateTestData-row").show();
205
+ $("#node-input-testDataPattern-row").show();
206
+ } else {
207
+ $("#node-input-testData-section").hide();
208
+ $("#node-input-generateTestData-row").hide();
209
+ $("#node-input-testDataPattern-row").hide();
210
+ }
211
+ });
212
+ </script>
213
+
214
+ <script type="text/html" data-help-name="modbus-tcp-avd">
215
+ <p>Volledige MODBUS TCP node met ondersteuning voor alle MODBUS functies en het volledige adresbereik.</p>
216
+
217
+ <h3>Inputs</h3>
218
+ <dl class="message-properties">
219
+ <dt>payload <span class="property-type">object</span></dt>
220
+ <dd>MODBUS request object met de volgende eigenschappen:</dd>
221
+ <dd>
222
+ <ul>
223
+ <li><code>function</code> - MODBUS functie code (1-24)</li>
224
+ <li><code>address</code> - Start adres (0-65535)</li>
225
+ <li><code>quantity</code> - Aantal registers/coils (voor read operaties)</li>
226
+ <li><code>value</code> - Waarde (voor single write operaties)</li>
227
+ <li><code>values</code> - Array van waarden (voor multiple write operaties)</li>
228
+ <li><code>unitId</code> - Optioneel: Unit ID override</li>
229
+ <li><code>timeout</code> - Optioneel: Timeout override</li>
230
+ </ul>
231
+ </dd>
232
+ </dl>
233
+
234
+ <h3>Outputs</h3>
235
+ <dl class="message-properties">
236
+ <dt>payload <span class="property-type">object</span></dt>
237
+ <dd>MODBUS response object met de volgende eigenschappen:</dd>
238
+ <dd>
239
+ <ul>
240
+ <li><code>function</code> - MODBUS functie code</li>
241
+ <li><code>address</code> - Start adres</li>
242
+ <li><code>data</code> - Gelezen data array</li>
243
+ <li><code>error</code> - Error object indien fout opgetreden</li>
244
+ </ul>
245
+ </dd>
246
+ </dl>
247
+
248
+ <h3>Details</h3>
249
+ <p>Deze node ondersteunt:</p>
250
+ <ul>
251
+ <li>TCP Client en Server modes</li>
252
+ <li>MODBUS Client en Server modes</li>
253
+ <li>Alle MODBUS functie codes (01-24)</li>
254
+ <li>Volledige adresbereik (0-65535)</li>
255
+ <li>Automatische reconnect en retry mechanismen</li>
256
+ </ul>
257
+
258
+ <h3>Voorbeelden</h3>
259
+ <h4>Read Holding Registers</h4>
260
+ <pre><code>{
261
+ "function": 3,
262
+ "address": 0,
263
+ "quantity": 10
264
+ }</code></pre>
265
+
266
+ <h4>Write Single Register</h4>
267
+ <pre><code>{
268
+ "function": 6,
269
+ "address": 0,
270
+ "value": 1234
271
+ }</code></pre>
272
+
273
+ <h4>Write Multiple Coils</h4>
274
+ <pre><code>{
275
+ "function": 15,
276
+ "address": 0,
277
+ "values": [true, false, true, false]
278
+ }</code></pre>
279
+
280
+ <h4>Toon Alle Register Data (Server Mode)</h4>
281
+ <pre><code>{
282
+ "action": "showData"
283
+ }</code></pre>
284
+ <p>Geeft een overzicht van alle register data in de server.</p>
285
+
286
+ <h4>Lees en Toon Register Data (Client Mode)</h4>
287
+ <pre><code>{
288
+ "action": "readData",
289
+ "readType": "holdingRegisters",
290
+ "address": 0,
291
+ "quantity": 10
292
+ }</code></pre>
293
+ <p>Leest register data en geeft deze terug met een dataMap. readType kan zijn: "coils", "discreteInputs", "holdingRegisters", of "inputRegisters".</p>
294
+
295
+ <h4>Genereer Test Data (Server Mode)</h4>
296
+ <pre><code>{
297
+ "action": "generateTestData",
298
+ "pattern": "incrementing",
299
+ "dataType": "holdingRegisters",
300
+ "address": 0,
301
+ "quantity": 100
302
+ }</code></pre>
303
+ <p>Genereert testdata in de server registers. Patronen: "incrementing", "random", "sine", "square", "alternating". Data types: "coils", "discreteInputs", "holdingRegisters", "inputRegisters".</p>
304
+
305
+ <h3>Data Weergave</h3>
306
+ <p>De node kan register data op verschillende manieren zichtbaar maken:</p>
307
+ <ul>
308
+ <li><b>Status Weergave</b>: Schakel "Toon Data in Status" in om de laatste waarden in de node status te zien</li>
309
+ <li><b>Debug Mode</b>: Schakel "Debug Mode" in om alle data naar het debug panel te loggen</li>
310
+ <li><b>Show Data Actie</b>: Gebruik <code>{"action": "showData"}</code> om alle server register data te bekijken</li>
311
+ </ul>
312
+ </script>