@atelieruldetehnologii/node-red-custome-solutions 0.62.22
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/NOTICE +56 -0
- package/PROPRIETARY-LICENSE.txt +157 -0
- package/README.md +105 -0
- package/TERMS-AND-CONDITIONS.md +311 -0
- package/advantech-read/advantech-read.html +775 -0
- package/advantech-read/advantech-read.js +449 -0
- package/advantech-write/advantech-write.html +413 -0
- package/advantech-write/advantech-write.js +338 -0
- package/bess-control/bess-control.html +569 -0
- package/bess-control/bess-control.js +541 -0
- package/bess-control/lib/allocation.js +149 -0
- package/bess-control/lib/batteries.js +86 -0
- package/bess-control/lib/helpers.js +157 -0
- package/bess-control/lib/messages.js +131 -0
- package/bess-control/lib/runtime.js +156 -0
- package/carlo-gavazzi/carlo-gavazzi.html +4327 -0
- package/carlo-gavazzi/carlo-gavazzi.js +3081 -0
- package/control-export/control-export.html +3644 -0
- package/control-export/control-export.js +2192 -0
- package/control-reactive/control-reactive.html +3136 -0
- package/control-reactive/control-reactive.js +2124 -0
- package/fronius-emulator/README.md +258 -0
- package/fronius-emulator/fronius-emulator.html +170 -0
- package/fronius-emulator/fronius-emulator.js +520 -0
- package/fronius-emulator/lib/binary-codec.js +65 -0
- package/fronius-emulator/lib/fronius-register-map.js +185 -0
- package/fronius-emulator/lib/modbus-parser.js +61 -0
- package/fronius-emulator/lib/modbus-tcp-server.js +224 -0
- package/fronius-emulator/lib/validation.js +206 -0
- package/fronius-emulator/lib/virtual-meter.js +132 -0
- package/fronius-read/fronius-read.html +3944 -0
- package/fronius-read/fronius-read.js +1466 -0
- package/fronius-read/lib/inverter-profiles.js +711 -0
- package/fronius-read/lib/sunspec-core.js +303 -0
- package/fronius-read/lib/sunspec-model-parsers.js +845 -0
- package/fronius-write/fronius-write.html +1789 -0
- package/fronius-write/fronius-write.js +2531 -0
- package/influxdb/influxdb.html +1077 -0
- package/influxdb/influxdb.js +1487 -0
- package/janitza/janitza.html +2562 -0
- package/janitza/janitza.js +1500 -0
- package/janitza/lib/janitza-profiles.js +371 -0
- package/lib/a3-test-server.js +199 -0
- package/lib/adam-6000-profiles.js +173 -0
- package/lib/licensing/constants.js +103 -0
- package/lib/licensing/device-id.js +251 -0
- package/lib/licensing/errors.js +21 -0
- package/lib/licensing/license-client.js +377 -0
- package/lib/licensing/license-state.js +50 -0
- package/lib/licensing/node-guard.js +150 -0
- package/lib/licensing/package-integrity.js +167 -0
- package/lib/licensing/package-integrity.json +513 -0
- package/lib/licensing/public-key.pem +3 -0
- package/lib/licensing/public-key.pem.example +2 -0
- package/lib/licensing/public-keys.js +18 -0
- package/lib/licensing/storage.js +63 -0
- package/lib/licensing/token-verifier.js +84 -0
- package/lib/numbers.js +26 -0
- package/license/atelier-license.html +88 -0
- package/license/atelier-license.js +170 -0
- package/modbus-tcp-discover/modbus-tcp-discover.html +190 -0
- package/modbus-tcp-discover/modbus-tcp-discover.js +706 -0
- package/multi-battery/multi-battery.html +649 -0
- package/multi-battery/multi-battery.js +668 -0
- package/multi-grid/multi-grid.html +745 -0
- package/multi-grid/multi-grid.js +1392 -0
- package/multi-inverter/lib/engine-core.js +237 -0
- package/multi-inverter/multi-inverter.html +2674 -0
- package/multi-inverter/multi-inverter.js +1393 -0
- package/package.json +109 -0
- package/phoenix-contact/lib/eem-ma370-advanced.js +175 -0
- package/phoenix-contact/lib/eem-ma370.js +138 -0
- package/phoenix-contact/lib/integrations.js +149 -0
- package/phoenix-contact/lib/phoenix-contact-profile.js +35030 -0
- package/phoenix-contact/phoenix-contact.html +840 -0
- package/phoenix-contact/phoenix-contact.js +679 -0
- package/pv-generator/pv-generator.html +284 -0
- package/pv-generator/pv-generator.js +387 -0
- package/pylontech-read/pylontech-read.html +763 -0
- package/pylontech-read/pylontech-read.js +518 -0
- package/pylontech-write/pylontech-write.html +405 -0
- package/pylontech-write/pylontech-write.js +546 -0
- package/scada-aggregator/lib/aggregate.js +72 -0
- package/scada-aggregator/lib/groups.js +39 -0
- package/scada-aggregator/scada-aggregator.html +108 -0
- package/scada-aggregator/scada-aggregator.js +117 -0
- package/scada-server/lib/aggregator-map.js +58 -0
- package/scada-server/lib/encoding.js +235 -0
- package/scada-server/lib/modbus-server.js +492 -0
- package/scada-server/lib/object-path.js +18 -0
- package/scada-server/lib/register-map.js +288 -0
- package/scada-server/scada-server.html +1419 -0
- package/scada-server/scada-server.js +704 -0
- package/scripts/check-syntax.js +66 -0
- package/scripts/package-integrity.js +46 -0
- package/scripts/package-release.js +116 -0
- package/scripts/run-tests.js +2178 -0
- package/scripts/tgz-integrity.js +74 -0
- package/sma-read/lib/sunspec-core.js +83 -0
- package/sma-read/lib/sunspec-model-parsers.js +853 -0
- package/sma-read/sma-read.html +659 -0
- package/sma-read/sma-read.js +458 -0
- package/sma-write/sma-write.html +105 -0
- package/sma-write/sma-write.js +270 -0
- package/victron-read/lib/mqtt-state.js +176 -0
- package/victron-read/victron-read.html +1074 -0
- package/victron-read/victron-read.js +1222 -0
|
@@ -0,0 +1,3136 @@
|
|
|
1
|
+
<script type="text/javascript">
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
(function() {
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
function buildDefinition(typeName, isLegacy) {
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
const tuningPresets = {
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
normal: { deadbandVar: 100, filterTauMs: 4000, kp: 0.08, ki: 0, transientIgnoreMs: 0, maxStepUpVar: 200, maxStepDownVar: 200, adaptiveGains: false, adaptiveErrorBandVar: 2000, adaptiveMinScale: 0.2 },
|
|
14
|
+
|
|
15
|
+
stable_grid: { deadbandVar: 150, filterTauMs: 5000, kp: 0.06, ki: 0, transientIgnoreMs: 0, maxStepUpVar: 120, maxStepDownVar: 120, adaptiveGains: false, adaptiveErrorBandVar: 2500, adaptiveMinScale: 0.25 }
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
const tuningFieldSelector = "#node-input-deadbandVar, #node-input-filterTauMs, #node-input-kp, #node-input-ki, #node-input-transientIgnoreMs, #node-input-maxStepUpVar, #node-input-maxStepDownVar, #node-input-adaptiveErrorBandVar, #node-input-adaptiveMinScale";
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
const validationFieldSelector = "#node-input-deadbandVar, #node-input-commandDeadbandVar, #node-input-filterTauMs, #node-input-noiseThresholdVar, #node-input-kp, #node-input-ki, #node-input-controlPeriodMs, #node-input-minCommandIntervalMs, #node-input-settleAfterCommandMs, #node-input-noiseReleaseMs, #node-input-staleTimeoutMs, #node-input-nominalReactivePowerVar, #node-input-safeLimitOnStale, #node-input-transientIgnoreMs, #node-input-maxStepUpVar, #node-input-maxStepDownVar, #node-input-adaptiveErrorBandVar, #node-input-adaptiveMinScale, #node-input-failSecureTimeSec";
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
category: isLegacy ? "deprecated" : "Atelierul de Tehnologii",
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
color: "#6c8ebf",
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
defaults: {
|
|
39
|
+
license: { value: "", type: "atelier-license", required: true },
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
name: { value: "" },
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
mode: { value: "zero_feed_in" },
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
zeroFeedInMode: { value: "relative" },
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
tuningPreset: { value: "normal" },
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
gridSetPointVar: { value: 0, validate: RED.validators.number() },
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
nominalReactivePowerVar: { value: 25000, validate: RED.validators.number() },
|
|
58
|
+
|
|
59
|
+
nominalReactivePowerFromGlobal: { value: false },
|
|
60
|
+
|
|
61
|
+
nominalReactivePowerGlobalVar: {
|
|
62
|
+
|
|
63
|
+
value: "max_q",
|
|
64
|
+
|
|
65
|
+
validate: function(v) {
|
|
66
|
+
|
|
67
|
+
const useGlobal = $("#node-input-nominalReactivePowerFromGlobal").is(":checked");
|
|
68
|
+
|
|
69
|
+
return !useGlobal || String(v || "").trim().length > 0;
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
fixedReactivePowerVar: { value: 0, validate: RED.validators.number() },
|
|
77
|
+
|
|
78
|
+
fixedReactivePowerFromGlobal: { value: false },
|
|
79
|
+
|
|
80
|
+
fixedReactivePowerGlobalVar: {
|
|
81
|
+
|
|
82
|
+
value: "nominal_reactive_power",
|
|
83
|
+
|
|
84
|
+
validate: function(v) {
|
|
85
|
+
|
|
86
|
+
const useGlobal = $("#node-input-fixedReactivePowerFromGlobal").is(":checked");
|
|
87
|
+
|
|
88
|
+
return !useGlobal || String(v || "").trim().length > 0;
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
deadbandVar: { value: 100, validate: RED.validators.number() },
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
commandDeadbandVar: { value: 50, validate: RED.validators.number() },
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
filterTauMs: { value: 4000, validate: RED.validators.number() },
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
noiseThresholdVar: { value: 120, validate: RED.validators.number() },
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
kp: { value: 0.08, validate: RED.validators.number() },
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
ki: { value: 0, validate: RED.validators.number() },
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
controlPeriodMs: { value: 1000, validate: RED.validators.number() },
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
minCommandIntervalMs: { value: 10000, validate: RED.validators.number() },
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
settleAfterCommandMs: { value: 10000, validate: RED.validators.number() },
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
noiseReleaseMs: { value: 3000, validate: RED.validators.number() },
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
transientIgnoreMs: { value: 0, validate: RED.validators.number() },
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
maxStepUpVar: { value: 200, validate: RED.validators.number() },
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
maxStepDownVar: { value: 200, validate: RED.validators.number() },
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
adaptiveGains: { value: false },
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
adaptiveErrorBandVar: { value: 2500, validate: RED.validators.number() },
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
adaptiveMinScale: { value: 0.25, validate: RED.validators.number() },
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
maxStepVar: { value: 0, validate: RED.validators.number() },
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
staleTimeoutMs: { value: 5000, validate: RED.validators.number() },
|
|
147
|
+
|
|
148
|
+
maxFutureTimestampMs: { value: 2000, validate: RED.validators.number() },
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
safeLimitOnStale: { value: 0, validate: RED.validators.number() },
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
debugLevel: { value: "off" },
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
startLimitMode: { value: "last_limit" },
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
outputTopic: { value: "control-reactive" },
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
failSecureEnabled: { value: false },
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
failSecureTimeSec: {
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
value: 10,
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
validate: function(v) { return Number(v) >= 1; }
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
a3TestsEnabled: { value: false },
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
a3ModbusHost: { value: "0.0.0.0" },
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
a3ModbusPort: { value: 1503, validate: RED.validators.number() },
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
a3ModbusUnitId: { value: 1, validate: RED.validators.number() },
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
a3RampType: { value: "none" },
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
a3RampValue: { value: 0, validate: RED.validators.number() }
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
},
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
inputs: 1,
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
outputs: 1,
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
icon: "font-awesome/fa-bolt",
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
paletteLabel: isLegacy ? "reactive-control (legacy)" : "control-reactive",
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
label: function() {
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
return this.name || "control-reactive";
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
oneditprepare: function () {
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
let applyingPreset = false;
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
let editorReady = false;
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
function applyPreset(presetKey) {
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
const preset = tuningPresets[presetKey];
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
if (!preset) return;
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
applyingPreset = true;
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
$("#node-input-deadbandVar").val(preset.deadbandVar);
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
$("#node-input-filterTauMs").val(preset.filterTauMs);
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
$("#node-input-kp").val(preset.kp);
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
$("#node-input-ki").val(preset.ki);
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
$("#node-input-transientIgnoreMs").val(preset.transientIgnoreMs);
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
$("#node-input-maxStepUpVar").val(preset.maxStepUpVar);
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
$("#node-input-maxStepDownVar").val(preset.maxStepDownVar);
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
$("#node-input-adaptiveGains").prop("checked", !!preset.adaptiveGains);
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
$("#node-input-adaptiveErrorBandVar").val(preset.adaptiveErrorBandVar);
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
$("#node-input-adaptiveMinScale").val(preset.adaptiveMinScale);
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
applyingPreset = false;
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
const adaptiveEnabled = $("#node-input-adaptiveGains").is(":checked");
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
$("#row-adaptive-error-band, #row-adaptive-min-scale").toggle(adaptiveEnabled);
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
showValidation();
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
function markCustomPreset() {
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
if (!editorReady) return;
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
if (applyingPreset) return;
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
if ($("#node-input-tuningPreset").val() !== "custom") {
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
$("#node-input-tuningPreset").val("custom");
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
toggleFields();
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
function showValidation() {
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
const errors = [];
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
const warnings = [];
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
const mode = $("#node-input-mode").val();
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
const nominal = Number($("#node-input-nominalReactivePowerVar").val() || 0);
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
const fixed = Number($("#node-input-fixedReactivePowerVar").val() || 0);
|
|
332
|
+
const fixedFromGlobal = $("#node-input-fixedReactivePowerFromGlobal").is(":checked");
|
|
333
|
+
const fixedGlobalVar = String($("#node-input-fixedReactivePowerGlobalVar").val() || "").trim();
|
|
334
|
+
const nominalFromGlobal = $("#node-input-nominalReactivePowerFromGlobal").is(":checked");
|
|
335
|
+
const nominalGlobalVar = String($("#node-input-nominalReactivePowerGlobalVar").val() || "").trim();
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
const deadband = Number($("#node-input-deadbandVar").val() || 0);
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
const commandDeadband = Number($("#node-input-commandDeadbandVar").val() || 0);
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
const filterTauMs = Number($("#node-input-filterTauMs").val() || 0);
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
const noiseThresholdVar = Number($("#node-input-noiseThresholdVar").val() || 0);
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
const kp = Number($("#node-input-kp").val() || 0);
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
const ki = Number($("#node-input-ki").val() || 0);
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
const controlPeriodMs = Number($("#node-input-controlPeriodMs").val() || 0);
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
const minCommandIntervalMs = Number($("#node-input-minCommandIntervalMs").val() || 0);
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
const settleAfterCommandMs = Number($("#node-input-settleAfterCommandMs").val() || 0);
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
const noiseReleaseMs = Number($("#node-input-noiseReleaseMs").val() || 0);
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
const staleTimeoutMs = Number($("#node-input-staleTimeoutMs").val() || 0);
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
const safeLimitOnStale = Number($("#node-input-safeLimitOnStale").val() || 0);
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
const transientIgnoreMs = Number($("#node-input-transientIgnoreMs").val() || 0);
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
const maxStepUpVar = Number($("#node-input-maxStepUpVar").val() || 0);
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
const maxStepDownVar = Number($("#node-input-maxStepDownVar").val() || 0);
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
const adaptiveErrorBandVar = Number($("#node-input-adaptiveErrorBandVar").val() || 0);
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
const adaptiveMinScale = Number($("#node-input-adaptiveMinScale").val() || 0);
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
const failSecureEnabled = $("#node-input-failSecureEnabled").is(":checked");
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
const failSecureTimeSec = Number($("#node-input-failSecureTimeSec").val() || 0);
|
|
393
|
+
const a3Enabled = $("#node-input-a3TestsEnabled").is(":checked");
|
|
394
|
+
const a3Port = Number($("#node-input-a3ModbusPort").val() || 0);
|
|
395
|
+
const a3UnitId = Number($("#node-input-a3ModbusUnitId").val() || 0);
|
|
396
|
+
const a3RampValue = Number($("#node-input-a3RampValue").val() || 0);
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
if (nominal <= 0) {
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
errors.push("Max Q trebuie sa fie > 0.");
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
if (Math.abs(fixed) > nominal && mode === "nominal_reactive_power") {
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
warnings.push("Fixed Reactive Power depaseste Max Q si va fi limitat automat.");
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (fixedFromGlobal && !fixedGlobalVar && mode === "nominal_reactive_power") {
|
|
418
|
+
|
|
419
|
+
errors.push("Global Variable Name este obligatoriu cand citirea Fixed Reactive Power din variabila globala este activa.");
|
|
420
|
+
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (nominalFromGlobal && !nominalGlobalVar) {
|
|
424
|
+
|
|
425
|
+
errors.push("Global Variable Name este obligatoriu cand citirea Max Q din variabila globala este activa.");
|
|
426
|
+
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
if (deadband < 0) {
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
errors.push("Deadband trebuie sa fie >= 0.");
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
if (deadband > 0 && deadband < 20) {
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
warnings.push("Deadband foarte mic (<20VAr) poate produce oscilatii.");
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
if (commandDeadband < 0) {
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
errors.push("Command Deadband trebuie sa fie >= 0.");
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
if (commandDeadband > 0 && commandDeadband < 20) {
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
warnings.push("Command Deadband foarte mic (<20VAr) poate retrimite prea des catre invertor.");
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
if (noiseThresholdVar < 0) {
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
errors.push("Noise Threshold trebuie sa fie >= 0 VAr.");
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
if (noiseReleaseMs < 0) {
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
errors.push("Noise Release trebuie sa fie >= 0 ms.");
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
if (staleTimeoutMs > 0 && staleTimeoutMs < controlPeriodMs) {
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
errors.push("Stale Timeout trebuie sa fie >= Control Period.");
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
if (minCommandIntervalMs < 0) {
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
errors.push("Min Command Interval trebuie sa fie >= 0 ms.");
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
if (minCommandIntervalMs > 0 && minCommandIntervalMs < controlPeriodMs) {
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
warnings.push("Min Command Interval mai mic decat Control Period are efect redus.");
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
if (settleAfterCommandMs < 0) {
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
errors.push("Settle After Command trebuie sa fie >= 0 ms.");
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
if (Math.abs(safeLimitOnStale) > nominal) {
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
errors.push("Safe Limit on Stale trebuie sa fie in intervalul [-Max Q, +Max Q].");
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
if (ki > 0.08) {
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
warnings.push("Ki este ridicat; poti avea overshoot sau hunting.");
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
if (kp > 0.8) {
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
warnings.push("Kp ridicat; verifica stabilitatea in sarcina variabila.");
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
if (filterTauMs > 0 && filterTauMs < Math.max(50, controlPeriodMs / 2)) {
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
warnings.push("Filter Tau foarte mic fata de Control Period poate lasa zgomotul sa intre in regulator.");
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
if (transientIgnoreMs < 0) {
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
errors.push("Transient Ignore trebuie sa fie >= 0 ms.");
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
if (maxStepUpVar < 0 || maxStepDownVar < 0) {
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
errors.push("Max Step Up/Down trebuie sa fie >= 0.");
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
if (adaptiveErrorBandVar < 1) {
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
errors.push("Adaptive Error Band trebuie sa fie >= 1 VAr.");
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
if (adaptiveMinScale <= 0 || adaptiveMinScale > 1) {
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
errors.push("Adaptive Min Scale trebuie sa fie in intervalul (0, 1].");
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
if (failSecureEnabled && failSecureTimeSec < 1) {
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
errors.push("Fail Secure Time trebuie sa fie >= 1 sec.");
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
if (a3Enabled && a3Port < 1) {
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
errors.push("A3 Modbus Port trebuie sa fie >= 1.");
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
if (a3Enabled && a3UnitId < 0) {
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
errors.push("A3 Unit ID trebuie sa fie >= 0.");
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
if (a3Enabled && a3RampValue < 0) {
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
errors.push("A3 Ramp Value trebuie sa fie >= 0.");
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
const blocks = [];
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
if (errors.length) {
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
blocks.push('<div class="cr-validation-block cr-error"><i class="fa fa-exclamation-triangle"></i> ' + errors.join(" ") + '</div>');
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
if (warnings.length) {
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
blocks.push('<div class="cr-validation-block cr-warning"><i class="fa fa-exclamation-circle"></i> ' + warnings.join(" ") + '</div>');
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
$("#node-control-reactive-validation").html(blocks.join("")).toggle(blocks.length > 0);
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
function toggleFields() {
|
|
659
|
+
|
|
660
|
+
|
|
661
|
+
if ($("#node-input-a3TestsEnabled").is(":checked") && $("#node-input-mode").val() !== "nominal_reactive_power") {
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
$("#node-input-mode").val("nominal_reactive_power");
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
const mode = $("#node-input-mode").val();
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
const showAdvanced = $("#node-input-tuningPreset").val() === "custom";
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
const closedLoop = mode !== "nominal_reactive_power";
|
|
677
|
+
const fixedFromGlobal = $("#node-input-fixedReactivePowerFromGlobal").is(":checked");
|
|
678
|
+
const nominalFromGlobal = $("#node-input-nominalReactivePowerFromGlobal").is(":checked");
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
$("#row-grid-setpoint").toggle(mode === "grid_set_point");
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
$("#row-zero-feed-in-mode").toggle(mode === "zero_feed_in");
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
$("#row-fixed-reactive-power").toggle(mode === "nominal_reactive_power" && !fixedFromGlobal);
|
|
689
|
+
$("#row-fixed-reactive-global-checkbox").toggle(mode === "nominal_reactive_power");
|
|
690
|
+
$("#row-fixed-reactive-global-var").toggle(mode === "nominal_reactive_power" && fixedFromGlobal);
|
|
691
|
+
|
|
692
|
+
$("#row-max-q").toggle(!nominalFromGlobal);
|
|
693
|
+
$("#row-max-q-global-var").toggle(nominalFromGlobal);
|
|
694
|
+
|
|
695
|
+
|
|
696
|
+
$(".advanced-section").toggle(showAdvanced);
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
$(".loop-row").toggle(closedLoop || showAdvanced);
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
$("#row-fail-secure-time").toggle($("#node-input-failSecureEnabled").is(":checked"));
|
|
703
|
+
$("#row-a3-modbus-host, #row-a3-modbus-port, #row-a3-modbus-unit, #row-a3-ramp-type, #row-a3-ramp-value, #row-a3-map").toggle($("#node-input-a3TestsEnabled").is(":checked"));
|
|
704
|
+
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
const adaptiveEnabled = $("#node-input-adaptiveGains").is(":checked");
|
|
708
|
+
|
|
709
|
+
|
|
710
|
+
$("#row-adaptive-error-band, #row-adaptive-min-scale").toggle(adaptiveEnabled && (closedLoop || showAdvanced));
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
showValidation();
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
$("#node-input-mode")
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
.off(".crEditor")
|
|
725
|
+
|
|
726
|
+
|
|
727
|
+
.on("change.crEditor", toggleFields);
|
|
728
|
+
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
const zeroModeCurrent = String($("#node-input-zeroFeedInMode").val() || "").toLowerCase();
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
if (zeroModeCurrent !== "relative" && zeroModeCurrent !== "absolute") {
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
$("#node-input-zeroFeedInMode").val("relative");
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
$("#node-input-tuningPreset")
|
|
745
|
+
|
|
746
|
+
|
|
747
|
+
.off(".crEditor")
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
.on("change.crEditor", function() {
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
const presetKey = $("#node-input-tuningPreset").val();
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
if (presetKey !== "custom") {
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
applyPreset(presetKey);
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
toggleFields();
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
$(tuningFieldSelector)
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
.off(".crEditor")
|
|
776
|
+
|
|
777
|
+
|
|
778
|
+
.on("keyup.crEditor change.crEditor", markCustomPreset);
|
|
779
|
+
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
$(validationFieldSelector)
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
.off(".crEditor")
|
|
786
|
+
|
|
787
|
+
|
|
788
|
+
.on("keyup.crEditor change.crEditor", showValidation);
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
$("#node-input-adaptiveGains")
|
|
793
|
+
|
|
794
|
+
|
|
795
|
+
.off(".crEditor")
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
.on("change.crEditor", toggleFields);
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
$("#node-input-failSecureEnabled")
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
.off(".crEditor")
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
.on("change.crEditor", toggleFields);
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
$("#node-input-fixedReactivePowerFromGlobal")
|
|
812
|
+
|
|
813
|
+
.off(".crEditor")
|
|
814
|
+
|
|
815
|
+
.on("change.crEditor", toggleFields);
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
$("#node-input-fixedReactivePowerGlobalVar")
|
|
819
|
+
|
|
820
|
+
.off(".crEditor")
|
|
821
|
+
|
|
822
|
+
.on("blur.crEditor", function() {
|
|
823
|
+
|
|
824
|
+
const key = String($(this).val() || "").trim();
|
|
825
|
+
|
|
826
|
+
$(this).val(key || "nominal_reactive_power");
|
|
827
|
+
|
|
828
|
+
showValidation();
|
|
829
|
+
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
$("#node-input-nominalReactivePowerFromGlobal")
|
|
834
|
+
|
|
835
|
+
.off(".crEditor")
|
|
836
|
+
|
|
837
|
+
.on("change.crEditor", toggleFields);
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
$("#node-input-nominalReactivePowerGlobalVar")
|
|
841
|
+
|
|
842
|
+
.off(".crEditor")
|
|
843
|
+
|
|
844
|
+
.on("blur.crEditor", function() {
|
|
845
|
+
|
|
846
|
+
const key = String($(this).val() || "").trim();
|
|
847
|
+
|
|
848
|
+
$(this).val(key || "max_q");
|
|
849
|
+
|
|
850
|
+
showValidation();
|
|
851
|
+
|
|
852
|
+
});
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
$("#node-input-a3TestsEnabled")
|
|
856
|
+
|
|
857
|
+
.off(".crEditor")
|
|
858
|
+
|
|
859
|
+
.on("change.crEditor", function() {
|
|
860
|
+
|
|
861
|
+
if ($(this).is(":checked")) {
|
|
862
|
+
|
|
863
|
+
$("#node-input-mode").val("nominal_reactive_power");
|
|
864
|
+
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
toggleFields();
|
|
868
|
+
|
|
869
|
+
});
|
|
870
|
+
|
|
871
|
+
|
|
872
|
+
$("#node-input-a3ModbusPort, #node-input-a3ModbusUnitId, #node-input-a3RampValue")
|
|
873
|
+
|
|
874
|
+
.off(".crEditor")
|
|
875
|
+
|
|
876
|
+
.on("keyup.crEditor change.crEditor", showValidation);
|
|
877
|
+
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
if (!$("#node-input-tuningPreset").val()) {
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
$("#node-input-tuningPreset").val("normal");
|
|
884
|
+
|
|
885
|
+
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
if ($("#node-input-tuningPreset").val() !== "custom") {
|
|
890
|
+
|
|
891
|
+
|
|
892
|
+
applyPreset($("#node-input-tuningPreset").val());
|
|
893
|
+
|
|
894
|
+
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
toggleFields();
|
|
900
|
+
|
|
901
|
+
|
|
902
|
+
showValidation();
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
setTimeout(function () { editorReady = true; }, 0);
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
},
|
|
909
|
+
|
|
910
|
+
|
|
911
|
+
oneditsave: function () {
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
this.failSecureEnabled = $("#node-input-failSecureEnabled").is(":checked");
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
this.failSecureTimeSec = Number($("#node-input-failSecureTimeSec").val() || 10);
|
|
918
|
+
|
|
919
|
+
this.fixedReactivePowerFromGlobal = $("#node-input-fixedReactivePowerFromGlobal").is(":checked");
|
|
920
|
+
|
|
921
|
+
this.fixedReactivePowerGlobalVar = String($("#node-input-fixedReactivePowerGlobalVar").val() || "").trim() || "nominal_reactive_power";
|
|
922
|
+
|
|
923
|
+
this.a3TestsEnabled = $("#node-input-a3TestsEnabled").is(":checked");
|
|
924
|
+
|
|
925
|
+
this.a3ModbusHost = String($("#node-input-a3ModbusHost").val() || "").trim() || "0.0.0.0";
|
|
926
|
+
|
|
927
|
+
this.a3ModbusPort = Number($("#node-input-a3ModbusPort").val() || 1503);
|
|
928
|
+
|
|
929
|
+
this.a3ModbusUnitId = Number($("#node-input-a3ModbusUnitId").val() || 1);
|
|
930
|
+
|
|
931
|
+
this.a3RampType = $("#node-input-a3RampType").val() || "none";
|
|
932
|
+
|
|
933
|
+
this.a3RampValue = Number($("#node-input-a3RampValue").val() || 0);
|
|
934
|
+
|
|
935
|
+
if (this.a3TestsEnabled) {
|
|
936
|
+
|
|
937
|
+
$("#node-input-mode").val("nominal_reactive_power");
|
|
938
|
+
|
|
939
|
+
this.mode = "nominal_reactive_power";
|
|
940
|
+
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
|
|
944
|
+
this.outputs = this.failSecureEnabled ? 2 : 1;
|
|
945
|
+
|
|
946
|
+
|
|
947
|
+
$("#node-input-mode, #node-input-zeroFeedInMode, #node-input-tuningPreset, #node-input-deadbandVar, #node-input-commandDeadbandVar, #node-input-filterTauMs, #node-input-noiseThresholdVar, #node-input-kp, #node-input-ki, #node-input-controlPeriodMs, #node-input-minCommandIntervalMs, #node-input-settleAfterCommandMs, #node-input-noiseReleaseMs, #node-input-transientIgnoreMs, #node-input-maxStepUpVar, #node-input-maxStepDownVar, #node-input-adaptiveGains, #node-input-adaptiveErrorBandVar, #node-input-adaptiveMinScale, #node-input-staleTimeoutMs, #node-input-safeLimitOnStale, #node-input-nominalReactivePowerVar, #node-input-fixedReactivePowerVar, #node-input-fixedReactivePowerFromGlobal, #node-input-fixedReactivePowerGlobalVar, #node-input-failSecureEnabled, #node-input-failSecureTimeSec, #node-input-a3TestsEnabled, #node-input-a3ModbusPort, #node-input-a3ModbusUnitId, #node-input-a3RampValue").off(".crEditor");
|
|
948
|
+
|
|
949
|
+
|
|
950
|
+
},
|
|
951
|
+
|
|
952
|
+
|
|
953
|
+
oneditcancel: function () {
|
|
954
|
+
|
|
955
|
+
|
|
956
|
+
$("#node-input-mode, #node-input-zeroFeedInMode, #node-input-tuningPreset, #node-input-deadbandVar, #node-input-commandDeadbandVar, #node-input-filterTauMs, #node-input-noiseThresholdVar, #node-input-kp, #node-input-ki, #node-input-controlPeriodMs, #node-input-minCommandIntervalMs, #node-input-settleAfterCommandMs, #node-input-noiseReleaseMs, #node-input-transientIgnoreMs, #node-input-maxStepUpVar, #node-input-maxStepDownVar, #node-input-adaptiveGains, #node-input-adaptiveErrorBandVar, #node-input-adaptiveMinScale, #node-input-staleTimeoutMs, #node-input-safeLimitOnStale, #node-input-nominalReactivePowerVar, #node-input-fixedReactivePowerVar, #node-input-fixedReactivePowerFromGlobal, #node-input-fixedReactivePowerGlobalVar, #node-input-failSecureEnabled, #node-input-failSecureTimeSec, #node-input-a3TestsEnabled, #node-input-a3ModbusPort, #node-input-a3ModbusUnitId, #node-input-a3RampValue").off(".crEditor");
|
|
957
|
+
|
|
958
|
+
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
|
|
962
|
+
};
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
RED.nodes.registerType("control-reactive", buildDefinition("control-reactive", false));
|
|
970
|
+
|
|
971
|
+
|
|
972
|
+
RED.nodes.registerType("reactive-control", buildDefinition("reactive-control", true));
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
})();
|
|
976
|
+
|
|
977
|
+
|
|
978
|
+
</script>
|
|
979
|
+
|
|
980
|
+
|
|
981
|
+
|
|
982
|
+
<script type="text/html" data-template-name="control-reactive">
|
|
983
|
+
<div class="form-row"><label for="node-input-license"><i class="fa fa-key"></i> License</label><input type="text" id="node-input-license"></div>
|
|
984
|
+
|
|
985
|
+
|
|
986
|
+
<div class="control-reactive-editor">
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
<div class="pr-section">
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
<div class="pr-section-title"><i class="fa fa-sliders"></i> Basic</div>
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
<p class="pr-section-note">Setarile esentiale pentru functionarea nodului.</p>
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
|
|
999
|
+
<div class="pr-grid pr-grid-2">
|
|
1000
|
+
|
|
1001
|
+
|
|
1002
|
+
<div class="form-row">
|
|
1003
|
+
|
|
1004
|
+
|
|
1005
|
+
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
<input type="text" id="node-input-name" placeholder="control-reactive">
|
|
1009
|
+
|
|
1010
|
+
|
|
1011
|
+
</div>
|
|
1012
|
+
|
|
1013
|
+
|
|
1014
|
+
|
|
1015
|
+
<div class="form-row">
|
|
1016
|
+
|
|
1017
|
+
|
|
1018
|
+
<label for="node-input-mode"><i class="fa fa-cogs"></i> Mode</label>
|
|
1019
|
+
|
|
1020
|
+
|
|
1021
|
+
<select id="node-input-mode">
|
|
1022
|
+
|
|
1023
|
+
|
|
1024
|
+
<option value="zero_feed_in">Zero Feed-In</option>
|
|
1025
|
+
|
|
1026
|
+
|
|
1027
|
+
<option value="grid_set_point">Grid Set Point</option>
|
|
1028
|
+
|
|
1029
|
+
|
|
1030
|
+
<option value="nominal_reactive_power">Nominal Reactive Power</option>
|
|
1031
|
+
|
|
1032
|
+
|
|
1033
|
+
</select>
|
|
1034
|
+
|
|
1035
|
+
|
|
1036
|
+
</div>
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
|
|
1040
|
+
<div class="form-row" id="row-grid-setpoint">
|
|
1041
|
+
|
|
1042
|
+
|
|
1043
|
+
<label for="node-input-gridSetPointVar"><i class="fa fa-bullseye"></i> Grid Target (VAr)</label>
|
|
1044
|
+
|
|
1045
|
+
|
|
1046
|
+
<input type="text" id="node-input-gridSetPointVar" placeholder="0">
|
|
1047
|
+
|
|
1048
|
+
|
|
1049
|
+
</div>
|
|
1050
|
+
|
|
1051
|
+
|
|
1052
|
+
|
|
1053
|
+
<div class="form-row" id="row-zero-feed-in-mode">
|
|
1054
|
+
|
|
1055
|
+
|
|
1056
|
+
<label for="node-input-zeroFeedInMode"><i class="fa fa-crosshairs"></i> Zero Feed-In</label>
|
|
1057
|
+
|
|
1058
|
+
|
|
1059
|
+
<select id="node-input-zeroFeedInMode">
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
<option value="relative">0 Relativ</option>
|
|
1063
|
+
|
|
1064
|
+
|
|
1065
|
+
<option value="absolute">0 Absolut</option>
|
|
1066
|
+
|
|
1067
|
+
|
|
1068
|
+
</select>
|
|
1069
|
+
|
|
1070
|
+
|
|
1071
|
+
</div>
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
<div class="form-row" id="row-fixed-reactive-power">
|
|
1076
|
+
|
|
1077
|
+
|
|
1078
|
+
<label for="node-input-fixedReactivePowerVar"><i class="fa fa-bolt"></i> Fixed Reactive Power (VAr)</label>
|
|
1079
|
+
|
|
1080
|
+
|
|
1081
|
+
<input type="text" id="node-input-fixedReactivePowerVar" placeholder="0">
|
|
1082
|
+
|
|
1083
|
+
|
|
1084
|
+
</div>
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
<div class="form-row pr-checkbox-row" id="row-fixed-reactive-global-checkbox">
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
<label for="node-input-fixedReactivePowerFromGlobal"><i class="fa fa-globe"></i> Read Fixed Q From Global</label>
|
|
1091
|
+
|
|
1092
|
+
|
|
1093
|
+
<input type="checkbox" id="node-input-fixedReactivePowerFromGlobal">
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
</div>
|
|
1097
|
+
|
|
1098
|
+
|
|
1099
|
+
<div class="form-row" id="row-fixed-reactive-global-var">
|
|
1100
|
+
|
|
1101
|
+
|
|
1102
|
+
<label for="node-input-fixedReactivePowerGlobalVar"><i class="fa fa-key"></i> Global Variable Name</label>
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
<input type="text" id="node-input-fixedReactivePowerGlobalVar" placeholder="nominal_reactive_power">
|
|
1106
|
+
|
|
1107
|
+
|
|
1108
|
+
</div>
|
|
1109
|
+
|
|
1110
|
+
|
|
1111
|
+
<div class="form-row pr-checkbox-row">
|
|
1112
|
+
|
|
1113
|
+
|
|
1114
|
+
<label for="node-input-a3TestsEnabled"><i class="fa fa-flask"></i> Teste A3</label>
|
|
1115
|
+
|
|
1116
|
+
|
|
1117
|
+
<input type="checkbox" id="node-input-a3TestsEnabled">
|
|
1118
|
+
|
|
1119
|
+
|
|
1120
|
+
</div>
|
|
1121
|
+
|
|
1122
|
+
|
|
1123
|
+
<div class="form-row" id="row-a3-modbus-host">
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
<label for="node-input-a3ModbusHost"><i class="fa fa-server"></i> A3 Host</label>
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
<input type="text" id="node-input-a3ModbusHost" placeholder="0.0.0.0">
|
|
1130
|
+
|
|
1131
|
+
|
|
1132
|
+
</div>
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
<div class="form-row" id="row-a3-modbus-port">
|
|
1136
|
+
|
|
1137
|
+
|
|
1138
|
+
<label for="node-input-a3ModbusPort"><i class="fa fa-plug"></i> A3 Port</label>
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
<input type="text" id="node-input-a3ModbusPort" placeholder="1503">
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
</div>
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
<div class="form-row" id="row-a3-modbus-unit">
|
|
1148
|
+
|
|
1149
|
+
|
|
1150
|
+
<label for="node-input-a3ModbusUnitId"><i class="fa fa-hashtag"></i> A3 Unit ID</label>
|
|
1151
|
+
|
|
1152
|
+
|
|
1153
|
+
<input type="text" id="node-input-a3ModbusUnitId" placeholder="1">
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
</div>
|
|
1157
|
+
|
|
1158
|
+
|
|
1159
|
+
<div class="form-row" id="row-a3-ramp-type">
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
<label for="node-input-a3RampType"><i class="fa fa-sliders"></i> A3 Ramp Type</label>
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
<select id="node-input-a3RampType">
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
<option value="none">No ramp</option>
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
<option value="time">Ramp Time (s)</option>
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
<option value="gradient_pct">Gradient (%/s)</option>
|
|
1175
|
+
|
|
1176
|
+
|
|
1177
|
+
<option value="gradient_w">Gradient (VAr/s)</option>
|
|
1178
|
+
|
|
1179
|
+
|
|
1180
|
+
</select>
|
|
1181
|
+
|
|
1182
|
+
|
|
1183
|
+
</div>
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
<div class="form-row" id="row-a3-ramp-value">
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
<label for="node-input-a3RampValue"><i class="fa fa-tachometer"></i> A3 Ramp Value</label>
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
<input type="text" id="node-input-a3RampValue" placeholder="0">
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
</div>
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
<div class="form-row pr-span-2" id="row-a3-map">
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
<div class="cr-meta-info">A3 Modbus: reg 2-3 = nominal VAr (int32), reg 4 = ramp type (0 none, 1 time, 2 %/s, 3 VAr/s), reg 5-6 = ramp value (int32).</div>
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
</div>
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
|
|
1208
|
+
<div class="form-row">
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
<label for="node-input-tuningPreset"><i class="fa fa-magic"></i> Tuning Preset</label>
|
|
1212
|
+
|
|
1213
|
+
|
|
1214
|
+
<select id="node-input-tuningPreset">
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
<option value="normal">Normal</option>
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
<option value="stable_grid">Stable Grid Setpoint</option>
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
<option value="custom">Custom</option>
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
</select>
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
</div>
|
|
1230
|
+
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
<div class="form-row" id="row-max-q">
|
|
1234
|
+
|
|
1235
|
+
|
|
1236
|
+
<label for="node-input-nominalReactivePowerVar"><i class="fa fa-arrows-v"></i> Max Q (+/-VAr)</label>
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
<input type="text" id="node-input-nominalReactivePowerVar" placeholder="25000">
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
</div>
|
|
1243
|
+
|
|
1244
|
+
|
|
1245
|
+
<div class="form-row pr-checkbox-row">
|
|
1246
|
+
|
|
1247
|
+
<label for="node-input-nominalReactivePowerFromGlobal"><i class="fa fa-globe"></i> Read Max Q From Global</label>
|
|
1248
|
+
|
|
1249
|
+
<input type="checkbox" id="node-input-nominalReactivePowerFromGlobal">
|
|
1250
|
+
|
|
1251
|
+
</div>
|
|
1252
|
+
|
|
1253
|
+
|
|
1254
|
+
<div class="form-row" id="row-max-q-global-var">
|
|
1255
|
+
|
|
1256
|
+
<label for="node-input-nominalReactivePowerGlobalVar"><i class="fa fa-key"></i> Global Variable Name</label>
|
|
1257
|
+
|
|
1258
|
+
<input type="text" id="node-input-nominalReactivePowerGlobalVar" placeholder="max_q">
|
|
1259
|
+
|
|
1260
|
+
</div>
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
<div class="form-row pr-span-2" id="row-output-topic">
|
|
1265
|
+
|
|
1266
|
+
|
|
1267
|
+
<label for="node-input-outputTopic"><i class="fa fa-sign-out"></i> Output Topic</label>
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
<input type="text" id="node-input-outputTopic" placeholder="control-reactive">
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
</div>
|
|
1274
|
+
|
|
1275
|
+
|
|
1276
|
+
</div>
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
</div>
|
|
1280
|
+
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
<div class="pr-section advanced-section">
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
<div class="pr-section-title"><i class="fa fa-flask"></i> Advanced Parameters</div>
|
|
1287
|
+
|
|
1288
|
+
|
|
1289
|
+
<p class="pr-section-note">Parametri de control, stabilitate si dinamica regulatorului.</p>
|
|
1290
|
+
|
|
1291
|
+
|
|
1292
|
+
|
|
1293
|
+
<div class="pr-grid pr-grid-2">
|
|
1294
|
+
|
|
1295
|
+
|
|
1296
|
+
<div class="form-row loop-row">
|
|
1297
|
+
|
|
1298
|
+
|
|
1299
|
+
<label for="node-input-deadbandVar"><i class="fa fa-arrows-h"></i> Deadband (VAr)</label>
|
|
1300
|
+
|
|
1301
|
+
|
|
1302
|
+
<input type="text" id="node-input-deadbandVar" placeholder="100">
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
</div>
|
|
1306
|
+
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
<div class="form-row loop-row">
|
|
1310
|
+
|
|
1311
|
+
|
|
1312
|
+
<label for="node-input-filterTauMs"><i class="fa fa-filter"></i> Filter Tau (ms)</label>
|
|
1313
|
+
|
|
1314
|
+
|
|
1315
|
+
<input type="text" id="node-input-filterTauMs" placeholder="4000">
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
</div>
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
|
|
1322
|
+
<div class="form-row loop-row">
|
|
1323
|
+
|
|
1324
|
+
|
|
1325
|
+
<label for="node-input-noiseThresholdVar"><i class="fa fa-volume-up"></i> Noise Threshold (VAr)</label>
|
|
1326
|
+
|
|
1327
|
+
|
|
1328
|
+
<input type="text" id="node-input-noiseThresholdVar" placeholder="120">
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
</div>
|
|
1332
|
+
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
<div class="form-row loop-row">
|
|
1336
|
+
|
|
1337
|
+
|
|
1338
|
+
<label for="node-input-controlPeriodMs"><i class="fa fa-clock-o"></i> Control Period (ms)</label>
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
<input type="text" id="node-input-controlPeriodMs" placeholder="1000">
|
|
1342
|
+
|
|
1343
|
+
|
|
1344
|
+
</div>
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
|
|
1348
|
+
<div class="form-row loop-row">
|
|
1349
|
+
|
|
1350
|
+
|
|
1351
|
+
<label for="node-input-commandDeadbandVar"><i class="fa fa-exchange"></i> Command Deadband (VAr)</label>
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
<input type="text" id="node-input-commandDeadbandVar" placeholder="50">
|
|
1355
|
+
|
|
1356
|
+
|
|
1357
|
+
</div>
|
|
1358
|
+
|
|
1359
|
+
|
|
1360
|
+
|
|
1361
|
+
<div class="form-row loop-row">
|
|
1362
|
+
|
|
1363
|
+
|
|
1364
|
+
<label for="node-input-minCommandIntervalMs"><i class="fa fa-hourglass-half"></i> Min Command Interval (ms)</label>
|
|
1365
|
+
|
|
1366
|
+
|
|
1367
|
+
<input type="text" id="node-input-minCommandIntervalMs" placeholder="10000">
|
|
1368
|
+
|
|
1369
|
+
|
|
1370
|
+
</div>
|
|
1371
|
+
|
|
1372
|
+
|
|
1373
|
+
|
|
1374
|
+
<div class="form-row loop-row">
|
|
1375
|
+
|
|
1376
|
+
|
|
1377
|
+
<label for="node-input-settleAfterCommandMs"><i class="fa fa-clock-o"></i> Settle After Command (ms)</label>
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
<input type="text" id="node-input-settleAfterCommandMs" placeholder="10000">
|
|
1381
|
+
|
|
1382
|
+
|
|
1383
|
+
</div>
|
|
1384
|
+
|
|
1385
|
+
|
|
1386
|
+
|
|
1387
|
+
<div class="form-row loop-row">
|
|
1388
|
+
|
|
1389
|
+
|
|
1390
|
+
<label for="node-input-noiseReleaseMs"><i class="fa fa-pause-circle"></i> Noise Release (ms)</label>
|
|
1391
|
+
|
|
1392
|
+
|
|
1393
|
+
<input type="text" id="node-input-noiseReleaseMs" placeholder="3000">
|
|
1394
|
+
|
|
1395
|
+
|
|
1396
|
+
</div>
|
|
1397
|
+
|
|
1398
|
+
|
|
1399
|
+
|
|
1400
|
+
<div class="form-row loop-row">
|
|
1401
|
+
|
|
1402
|
+
|
|
1403
|
+
<label for="node-input-transientIgnoreMs"><i class="fa fa-hourglass-start"></i> Transient Ignore (ms)</label>
|
|
1404
|
+
|
|
1405
|
+
|
|
1406
|
+
<input type="text" id="node-input-transientIgnoreMs" placeholder="500">
|
|
1407
|
+
|
|
1408
|
+
|
|
1409
|
+
</div>
|
|
1410
|
+
|
|
1411
|
+
|
|
1412
|
+
|
|
1413
|
+
<div class="form-row loop-row">
|
|
1414
|
+
|
|
1415
|
+
|
|
1416
|
+
<label for="node-input-kp"><i class="fa fa-line-chart"></i> Kp</label>
|
|
1417
|
+
|
|
1418
|
+
|
|
1419
|
+
<input type="text" id="node-input-kp" placeholder="0.08">
|
|
1420
|
+
|
|
1421
|
+
|
|
1422
|
+
</div>
|
|
1423
|
+
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+
<div class="form-row loop-row">
|
|
1427
|
+
|
|
1428
|
+
|
|
1429
|
+
<label for="node-input-ki"><i class="fa fa-area-chart"></i> Ki</label>
|
|
1430
|
+
|
|
1431
|
+
|
|
1432
|
+
<input type="text" id="node-input-ki" placeholder="0.03">
|
|
1433
|
+
|
|
1434
|
+
|
|
1435
|
+
</div>
|
|
1436
|
+
|
|
1437
|
+
|
|
1438
|
+
|
|
1439
|
+
<div class="form-row loop-row">
|
|
1440
|
+
|
|
1441
|
+
|
|
1442
|
+
<label for="node-input-maxStepUpVar"><i class="fa fa-level-up"></i> Max Step Up (VAr/cycle)</label>
|
|
1443
|
+
|
|
1444
|
+
|
|
1445
|
+
<input type="text" id="node-input-maxStepUpVar" placeholder="200">
|
|
1446
|
+
|
|
1447
|
+
|
|
1448
|
+
</div>
|
|
1449
|
+
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
<div class="form-row loop-row">
|
|
1453
|
+
|
|
1454
|
+
|
|
1455
|
+
<label for="node-input-maxStepDownVar"><i class="fa fa-level-down"></i> Max Step Down (VAr/cycle)</label>
|
|
1456
|
+
|
|
1457
|
+
|
|
1458
|
+
<input type="text" id="node-input-maxStepDownVar" placeholder="200">
|
|
1459
|
+
|
|
1460
|
+
|
|
1461
|
+
</div>
|
|
1462
|
+
|
|
1463
|
+
|
|
1464
|
+
|
|
1465
|
+
<div class="form-row loop-row pr-checkbox-row">
|
|
1466
|
+
|
|
1467
|
+
|
|
1468
|
+
<label for="node-input-adaptiveGains"><i class="fa fa-magic"></i> Adaptive Gains</label>
|
|
1469
|
+
|
|
1470
|
+
|
|
1471
|
+
<input type="checkbox" id="node-input-adaptiveGains">
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
</div>
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
<div class="form-row loop-row" id="row-adaptive-error-band">
|
|
1479
|
+
|
|
1480
|
+
|
|
1481
|
+
<label for="node-input-adaptiveErrorBandVar"><i class="fa fa-arrows-h"></i> Adaptive Error Band (VAr)</label>
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
<input type="text" id="node-input-adaptiveErrorBandVar" placeholder="2500">
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
</div>
|
|
1488
|
+
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
<div class="form-row loop-row" id="row-adaptive-min-scale">
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
<label for="node-input-adaptiveMinScale"><i class="fa fa-compress"></i> Adaptive Min Scale</label>
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
<input type="text" id="node-input-adaptiveMinScale" placeholder="0.25">
|
|
1498
|
+
|
|
1499
|
+
|
|
1500
|
+
</div>
|
|
1501
|
+
|
|
1502
|
+
|
|
1503
|
+
</div>
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
</div>
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
<div class="pr-section">
|
|
1511
|
+
|
|
1512
|
+
|
|
1513
|
+
<div class="pr-section-title"><i class="fa fa-shield"></i> Safety & Output</div>
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
<p class="pr-section-note">Fallback la telemetry stale, start/stop si protectii suplimentare.</p>
|
|
1517
|
+
|
|
1518
|
+
|
|
1519
|
+
|
|
1520
|
+
<div class="pr-grid pr-grid-2">
|
|
1521
|
+
|
|
1522
|
+
|
|
1523
|
+
<div class="form-row">
|
|
1524
|
+
|
|
1525
|
+
|
|
1526
|
+
<label for="node-input-staleTimeoutMs"><i class="fa fa-shield"></i> Stale Timeout (ms)</label>
|
|
1527
|
+
|
|
1528
|
+
|
|
1529
|
+
<input type="text" id="node-input-staleTimeoutMs" placeholder="5000">
|
|
1530
|
+
|
|
1531
|
+
|
|
1532
|
+
</div>
|
|
1533
|
+
|
|
1534
|
+
<div class="form-row">
|
|
1535
|
+
<label for="node-input-maxFutureTimestampMs"><i class="fa fa-clock-o"></i> Max Future Timestamp (ms)</label>
|
|
1536
|
+
<input type="text" id="node-input-maxFutureTimestampMs" placeholder="2000">
|
|
1537
|
+
</div>
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
<div class="form-row">
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
<label for="node-input-safeLimitOnStale"><i class="fa fa-life-ring"></i> Safe Limit on Stale (VAr)</label>
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
<input type="text" id="node-input-safeLimitOnStale" placeholder="0">
|
|
1548
|
+
|
|
1549
|
+
|
|
1550
|
+
</div>
|
|
1551
|
+
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
<div class="form-row">
|
|
1555
|
+
|
|
1556
|
+
|
|
1557
|
+
<label for="node-input-debugLevel"><i class="fa fa-bug"></i> Debug</label>
|
|
1558
|
+
|
|
1559
|
+
|
|
1560
|
+
<select id="node-input-debugLevel">
|
|
1561
|
+
|
|
1562
|
+
|
|
1563
|
+
<option value="off">Off</option>
|
|
1564
|
+
|
|
1565
|
+
|
|
1566
|
+
<option value="normal">Normal</option>
|
|
1567
|
+
|
|
1568
|
+
|
|
1569
|
+
<option value="verbose">Verbose</option>
|
|
1570
|
+
|
|
1571
|
+
|
|
1572
|
+
</select>
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
</div>
|
|
1576
|
+
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
<div class="form-row">
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
<label for="node-input-startLimitMode"><i class="fa fa-play"></i> Start Limit</label>
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
<select id="node-input-startLimitMode">
|
|
1586
|
+
|
|
1587
|
+
|
|
1588
|
+
<option value="zero">Start from 0</option>
|
|
1589
|
+
|
|
1590
|
+
|
|
1591
|
+
<option value="last_limit">Start from Last Limit</option>
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
</select>
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
</div>
|
|
1598
|
+
|
|
1599
|
+
|
|
1600
|
+
|
|
1601
|
+
<div class="form-row pr-checkbox-row" id="row-fail-secure-enabled">
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
<label for="node-input-failSecureEnabled"><i class="fa fa-exclamation-triangle"></i> Fail Secure</label>
|
|
1605
|
+
|
|
1606
|
+
|
|
1607
|
+
<input type="checkbox" id="node-input-failSecureEnabled">
|
|
1608
|
+
|
|
1609
|
+
|
|
1610
|
+
</div>
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
<div class="form-row" id="row-fail-secure-time" style="display:none;">
|
|
1615
|
+
|
|
1616
|
+
|
|
1617
|
+
<label for="node-input-failSecureTimeSec"><i class="fa fa-clock-o"></i> Fail Secure Time (s)</label>
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
<input type="text" id="node-input-failSecureTimeSec" placeholder="10">
|
|
1621
|
+
|
|
1622
|
+
|
|
1623
|
+
</div>
|
|
1624
|
+
|
|
1625
|
+
|
|
1626
|
+
</div>
|
|
1627
|
+
|
|
1628
|
+
|
|
1629
|
+
|
|
1630
|
+
<div class="form-row" id="node-control-reactive-validation" style="display:none;"></div>
|
|
1631
|
+
|
|
1632
|
+
|
|
1633
|
+
</div>
|
|
1634
|
+
|
|
1635
|
+
|
|
1636
|
+
</div>
|
|
1637
|
+
|
|
1638
|
+
|
|
1639
|
+
</script>
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
<script type="text/html" data-template-name="reactive-control">
|
|
1644
|
+
<div class="form-row"><label for="node-input-license"><i class="fa fa-key"></i> License</label><input type="text" id="node-input-license"></div>
|
|
1645
|
+
|
|
1646
|
+
|
|
1647
|
+
<div class="control-reactive-editor">
|
|
1648
|
+
|
|
1649
|
+
|
|
1650
|
+
<div class="pr-section">
|
|
1651
|
+
|
|
1652
|
+
|
|
1653
|
+
<div class="pr-section-title"><i class="fa fa-sliders"></i> Basic</div>
|
|
1654
|
+
|
|
1655
|
+
|
|
1656
|
+
<p class="pr-section-note">Setarile esentiale pentru functionarea nodului.</p>
|
|
1657
|
+
|
|
1658
|
+
|
|
1659
|
+
|
|
1660
|
+
<div class="pr-grid pr-grid-2">
|
|
1661
|
+
|
|
1662
|
+
|
|
1663
|
+
<div class="form-row">
|
|
1664
|
+
|
|
1665
|
+
|
|
1666
|
+
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
1667
|
+
|
|
1668
|
+
|
|
1669
|
+
<input type="text" id="node-input-name" placeholder="control-reactive">
|
|
1670
|
+
|
|
1671
|
+
|
|
1672
|
+
</div>
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
|
|
1676
|
+
<div class="form-row">
|
|
1677
|
+
|
|
1678
|
+
|
|
1679
|
+
<label for="node-input-mode"><i class="fa fa-cogs"></i> Mode</label>
|
|
1680
|
+
|
|
1681
|
+
|
|
1682
|
+
<select id="node-input-mode">
|
|
1683
|
+
|
|
1684
|
+
|
|
1685
|
+
<option value="zero_feed_in">Zero Feed-In</option>
|
|
1686
|
+
|
|
1687
|
+
|
|
1688
|
+
<option value="grid_set_point">Grid Set Point</option>
|
|
1689
|
+
|
|
1690
|
+
|
|
1691
|
+
<option value="nominal_reactive_power">Nominal Reactive Power</option>
|
|
1692
|
+
|
|
1693
|
+
|
|
1694
|
+
</select>
|
|
1695
|
+
|
|
1696
|
+
|
|
1697
|
+
</div>
|
|
1698
|
+
|
|
1699
|
+
|
|
1700
|
+
|
|
1701
|
+
<div class="form-row" id="row-grid-setpoint">
|
|
1702
|
+
|
|
1703
|
+
|
|
1704
|
+
<label for="node-input-gridSetPointVar"><i class="fa fa-bullseye"></i> Grid Target (VAr)</label>
|
|
1705
|
+
|
|
1706
|
+
|
|
1707
|
+
<input type="text" id="node-input-gridSetPointVar" placeholder="0">
|
|
1708
|
+
|
|
1709
|
+
|
|
1710
|
+
</div>
|
|
1711
|
+
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
<div class="form-row" id="row-zero-feed-in-mode">
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
<label for="node-input-zeroFeedInMode"><i class="fa fa-crosshairs"></i> Zero Feed-In</label>
|
|
1718
|
+
|
|
1719
|
+
|
|
1720
|
+
<select id="node-input-zeroFeedInMode">
|
|
1721
|
+
|
|
1722
|
+
|
|
1723
|
+
<option value="relative">0 Relativ</option>
|
|
1724
|
+
|
|
1725
|
+
|
|
1726
|
+
<option value="absolute">0 Absolut</option>
|
|
1727
|
+
|
|
1728
|
+
|
|
1729
|
+
</select>
|
|
1730
|
+
|
|
1731
|
+
|
|
1732
|
+
</div>
|
|
1733
|
+
|
|
1734
|
+
|
|
1735
|
+
|
|
1736
|
+
<div class="form-row" id="row-fixed-reactive-power">
|
|
1737
|
+
|
|
1738
|
+
|
|
1739
|
+
<label for="node-input-fixedReactivePowerVar"><i class="fa fa-bolt"></i> Fixed Reactive Power (VAr)</label>
|
|
1740
|
+
|
|
1741
|
+
|
|
1742
|
+
<input type="text" id="node-input-fixedReactivePowerVar" placeholder="0">
|
|
1743
|
+
|
|
1744
|
+
|
|
1745
|
+
</div>
|
|
1746
|
+
|
|
1747
|
+
|
|
1748
|
+
|
|
1749
|
+
<div class="form-row">
|
|
1750
|
+
|
|
1751
|
+
|
|
1752
|
+
<label for="node-input-tuningPreset"><i class="fa fa-magic"></i> Tuning Preset</label>
|
|
1753
|
+
|
|
1754
|
+
|
|
1755
|
+
<select id="node-input-tuningPreset">
|
|
1756
|
+
|
|
1757
|
+
|
|
1758
|
+
<option value="normal">Normal</option>
|
|
1759
|
+
|
|
1760
|
+
|
|
1761
|
+
<option value="stable_grid">Stable Grid Setpoint</option>
|
|
1762
|
+
|
|
1763
|
+
|
|
1764
|
+
<option value="custom">Custom</option>
|
|
1765
|
+
|
|
1766
|
+
|
|
1767
|
+
</select>
|
|
1768
|
+
|
|
1769
|
+
|
|
1770
|
+
</div>
|
|
1771
|
+
|
|
1772
|
+
|
|
1773
|
+
|
|
1774
|
+
<div class="form-row" id="row-max-q">
|
|
1775
|
+
|
|
1776
|
+
|
|
1777
|
+
<label for="node-input-nominalReactivePowerVar"><i class="fa fa-arrows-v"></i> Max Q (+/-VAr)</label>
|
|
1778
|
+
|
|
1779
|
+
|
|
1780
|
+
<input type="text" id="node-input-nominalReactivePowerVar" placeholder="25000">
|
|
1781
|
+
|
|
1782
|
+
|
|
1783
|
+
</div>
|
|
1784
|
+
|
|
1785
|
+
|
|
1786
|
+
<div class="form-row pr-checkbox-row">
|
|
1787
|
+
|
|
1788
|
+
<label for="node-input-nominalReactivePowerFromGlobal"><i class="fa fa-globe"></i> Read Max Q From Global</label>
|
|
1789
|
+
|
|
1790
|
+
<input type="checkbox" id="node-input-nominalReactivePowerFromGlobal">
|
|
1791
|
+
|
|
1792
|
+
</div>
|
|
1793
|
+
|
|
1794
|
+
|
|
1795
|
+
<div class="form-row" id="row-max-q-global-var">
|
|
1796
|
+
|
|
1797
|
+
<label for="node-input-nominalReactivePowerGlobalVar"><i class="fa fa-key"></i> Global Variable Name</label>
|
|
1798
|
+
|
|
1799
|
+
<input type="text" id="node-input-nominalReactivePowerGlobalVar" placeholder="max_q">
|
|
1800
|
+
|
|
1801
|
+
</div>
|
|
1802
|
+
|
|
1803
|
+
|
|
1804
|
+
|
|
1805
|
+
<div class="form-row pr-span-2" id="row-output-topic">
|
|
1806
|
+
|
|
1807
|
+
|
|
1808
|
+
<label for="node-input-outputTopic"><i class="fa fa-sign-out"></i> Output Topic</label>
|
|
1809
|
+
|
|
1810
|
+
|
|
1811
|
+
<input type="text" id="node-input-outputTopic" placeholder="control-reactive">
|
|
1812
|
+
|
|
1813
|
+
|
|
1814
|
+
</div>
|
|
1815
|
+
|
|
1816
|
+
|
|
1817
|
+
</div>
|
|
1818
|
+
|
|
1819
|
+
|
|
1820
|
+
</div>
|
|
1821
|
+
|
|
1822
|
+
|
|
1823
|
+
|
|
1824
|
+
<div class="pr-section advanced-section">
|
|
1825
|
+
|
|
1826
|
+
|
|
1827
|
+
<div class="pr-section-title"><i class="fa fa-flask"></i> Advanced Parameters</div>
|
|
1828
|
+
|
|
1829
|
+
|
|
1830
|
+
<p class="pr-section-note">Parametri de control, stabilitate si dinamica regulatorului.</p>
|
|
1831
|
+
|
|
1832
|
+
|
|
1833
|
+
|
|
1834
|
+
<div class="pr-grid pr-grid-2">
|
|
1835
|
+
|
|
1836
|
+
|
|
1837
|
+
<div class="form-row loop-row">
|
|
1838
|
+
|
|
1839
|
+
|
|
1840
|
+
<label for="node-input-deadbandVar"><i class="fa fa-arrows-h"></i> Deadband (VAr)</label>
|
|
1841
|
+
|
|
1842
|
+
|
|
1843
|
+
<input type="text" id="node-input-deadbandVar" placeholder="100">
|
|
1844
|
+
|
|
1845
|
+
|
|
1846
|
+
</div>
|
|
1847
|
+
|
|
1848
|
+
|
|
1849
|
+
|
|
1850
|
+
<div class="form-row loop-row">
|
|
1851
|
+
|
|
1852
|
+
|
|
1853
|
+
<label for="node-input-filterTauMs"><i class="fa fa-filter"></i> Filter Tau (ms)</label>
|
|
1854
|
+
|
|
1855
|
+
|
|
1856
|
+
<input type="text" id="node-input-filterTauMs" placeholder="4000">
|
|
1857
|
+
|
|
1858
|
+
|
|
1859
|
+
</div>
|
|
1860
|
+
|
|
1861
|
+
|
|
1862
|
+
|
|
1863
|
+
<div class="form-row loop-row">
|
|
1864
|
+
|
|
1865
|
+
|
|
1866
|
+
<label for="node-input-noiseThresholdVar"><i class="fa fa-volume-up"></i> Noise Threshold (VAr)</label>
|
|
1867
|
+
|
|
1868
|
+
|
|
1869
|
+
<input type="text" id="node-input-noiseThresholdVar" placeholder="120">
|
|
1870
|
+
|
|
1871
|
+
|
|
1872
|
+
</div>
|
|
1873
|
+
|
|
1874
|
+
|
|
1875
|
+
|
|
1876
|
+
<div class="form-row loop-row">
|
|
1877
|
+
|
|
1878
|
+
|
|
1879
|
+
<label for="node-input-controlPeriodMs"><i class="fa fa-clock-o"></i> Control Period (ms)</label>
|
|
1880
|
+
|
|
1881
|
+
|
|
1882
|
+
<input type="text" id="node-input-controlPeriodMs" placeholder="1000">
|
|
1883
|
+
|
|
1884
|
+
|
|
1885
|
+
</div>
|
|
1886
|
+
|
|
1887
|
+
|
|
1888
|
+
|
|
1889
|
+
<div class="form-row loop-row">
|
|
1890
|
+
|
|
1891
|
+
|
|
1892
|
+
<label for="node-input-commandDeadbandVar"><i class="fa fa-exchange"></i> Command Deadband (VAr)</label>
|
|
1893
|
+
|
|
1894
|
+
|
|
1895
|
+
<input type="text" id="node-input-commandDeadbandVar" placeholder="50">
|
|
1896
|
+
|
|
1897
|
+
|
|
1898
|
+
</div>
|
|
1899
|
+
|
|
1900
|
+
|
|
1901
|
+
|
|
1902
|
+
<div class="form-row loop-row">
|
|
1903
|
+
|
|
1904
|
+
|
|
1905
|
+
<label for="node-input-minCommandIntervalMs"><i class="fa fa-hourglass-half"></i> Min Command Interval (ms)</label>
|
|
1906
|
+
|
|
1907
|
+
|
|
1908
|
+
<input type="text" id="node-input-minCommandIntervalMs" placeholder="10000">
|
|
1909
|
+
|
|
1910
|
+
|
|
1911
|
+
</div>
|
|
1912
|
+
|
|
1913
|
+
|
|
1914
|
+
|
|
1915
|
+
<div class="form-row loop-row">
|
|
1916
|
+
|
|
1917
|
+
|
|
1918
|
+
<label for="node-input-settleAfterCommandMs"><i class="fa fa-clock-o"></i> Settle After Command (ms)</label>
|
|
1919
|
+
|
|
1920
|
+
|
|
1921
|
+
<input type="text" id="node-input-settleAfterCommandMs" placeholder="10000">
|
|
1922
|
+
|
|
1923
|
+
|
|
1924
|
+
</div>
|
|
1925
|
+
|
|
1926
|
+
|
|
1927
|
+
|
|
1928
|
+
<div class="form-row loop-row">
|
|
1929
|
+
|
|
1930
|
+
|
|
1931
|
+
<label for="node-input-noiseReleaseMs"><i class="fa fa-pause-circle"></i> Noise Release (ms)</label>
|
|
1932
|
+
|
|
1933
|
+
|
|
1934
|
+
<input type="text" id="node-input-noiseReleaseMs" placeholder="3000">
|
|
1935
|
+
|
|
1936
|
+
|
|
1937
|
+
</div>
|
|
1938
|
+
|
|
1939
|
+
|
|
1940
|
+
|
|
1941
|
+
<div class="form-row loop-row">
|
|
1942
|
+
|
|
1943
|
+
|
|
1944
|
+
<label for="node-input-transientIgnoreMs"><i class="fa fa-hourglass-start"></i> Transient Ignore (ms)</label>
|
|
1945
|
+
|
|
1946
|
+
|
|
1947
|
+
<input type="text" id="node-input-transientIgnoreMs" placeholder="500">
|
|
1948
|
+
|
|
1949
|
+
|
|
1950
|
+
</div>
|
|
1951
|
+
|
|
1952
|
+
|
|
1953
|
+
|
|
1954
|
+
<div class="form-row loop-row">
|
|
1955
|
+
|
|
1956
|
+
|
|
1957
|
+
<label for="node-input-kp"><i class="fa fa-line-chart"></i> Kp</label>
|
|
1958
|
+
|
|
1959
|
+
|
|
1960
|
+
<input type="text" id="node-input-kp" placeholder="0.08">
|
|
1961
|
+
|
|
1962
|
+
|
|
1963
|
+
</div>
|
|
1964
|
+
|
|
1965
|
+
|
|
1966
|
+
|
|
1967
|
+
<div class="form-row loop-row">
|
|
1968
|
+
|
|
1969
|
+
|
|
1970
|
+
<label for="node-input-ki"><i class="fa fa-area-chart"></i> Ki</label>
|
|
1971
|
+
|
|
1972
|
+
|
|
1973
|
+
<input type="text" id="node-input-ki" placeholder="0.03">
|
|
1974
|
+
|
|
1975
|
+
|
|
1976
|
+
</div>
|
|
1977
|
+
|
|
1978
|
+
|
|
1979
|
+
|
|
1980
|
+
<div class="form-row loop-row">
|
|
1981
|
+
|
|
1982
|
+
|
|
1983
|
+
<label for="node-input-maxStepUpVar"><i class="fa fa-level-up"></i> Max Step Up (VAr/cycle)</label>
|
|
1984
|
+
|
|
1985
|
+
|
|
1986
|
+
<input type="text" id="node-input-maxStepUpVar" placeholder="200">
|
|
1987
|
+
|
|
1988
|
+
|
|
1989
|
+
</div>
|
|
1990
|
+
|
|
1991
|
+
|
|
1992
|
+
|
|
1993
|
+
<div class="form-row loop-row">
|
|
1994
|
+
|
|
1995
|
+
|
|
1996
|
+
<label for="node-input-maxStepDownVar"><i class="fa fa-level-down"></i> Max Step Down (VAr/cycle)</label>
|
|
1997
|
+
|
|
1998
|
+
|
|
1999
|
+
<input type="text" id="node-input-maxStepDownVar" placeholder="200">
|
|
2000
|
+
|
|
2001
|
+
|
|
2002
|
+
</div>
|
|
2003
|
+
|
|
2004
|
+
|
|
2005
|
+
|
|
2006
|
+
<div class="form-row loop-row pr-checkbox-row">
|
|
2007
|
+
|
|
2008
|
+
|
|
2009
|
+
<label for="node-input-adaptiveGains"><i class="fa fa-magic"></i> Adaptive Gains</label>
|
|
2010
|
+
|
|
2011
|
+
|
|
2012
|
+
<input type="checkbox" id="node-input-adaptiveGains">
|
|
2013
|
+
|
|
2014
|
+
|
|
2015
|
+
</div>
|
|
2016
|
+
|
|
2017
|
+
|
|
2018
|
+
|
|
2019
|
+
<div class="form-row loop-row" id="row-adaptive-error-band">
|
|
2020
|
+
|
|
2021
|
+
|
|
2022
|
+
<label for="node-input-adaptiveErrorBandVar"><i class="fa fa-arrows-h"></i> Adaptive Error Band (VAr)</label>
|
|
2023
|
+
|
|
2024
|
+
|
|
2025
|
+
<input type="text" id="node-input-adaptiveErrorBandVar" placeholder="2500">
|
|
2026
|
+
|
|
2027
|
+
|
|
2028
|
+
</div>
|
|
2029
|
+
|
|
2030
|
+
|
|
2031
|
+
|
|
2032
|
+
<div class="form-row loop-row" id="row-adaptive-min-scale">
|
|
2033
|
+
|
|
2034
|
+
|
|
2035
|
+
<label for="node-input-adaptiveMinScale"><i class="fa fa-compress"></i> Adaptive Min Scale</label>
|
|
2036
|
+
|
|
2037
|
+
|
|
2038
|
+
<input type="text" id="node-input-adaptiveMinScale" placeholder="0.25">
|
|
2039
|
+
|
|
2040
|
+
|
|
2041
|
+
</div>
|
|
2042
|
+
|
|
2043
|
+
|
|
2044
|
+
</div>
|
|
2045
|
+
|
|
2046
|
+
|
|
2047
|
+
</div>
|
|
2048
|
+
|
|
2049
|
+
|
|
2050
|
+
|
|
2051
|
+
<div class="pr-section">
|
|
2052
|
+
|
|
2053
|
+
|
|
2054
|
+
<div class="pr-section-title"><i class="fa fa-shield"></i> Safety & Output</div>
|
|
2055
|
+
|
|
2056
|
+
|
|
2057
|
+
<p class="pr-section-note">Fallback la telemetry stale, start/stop si protectii suplimentare.</p>
|
|
2058
|
+
|
|
2059
|
+
|
|
2060
|
+
|
|
2061
|
+
<div class="pr-grid pr-grid-2">
|
|
2062
|
+
|
|
2063
|
+
|
|
2064
|
+
<div class="form-row">
|
|
2065
|
+
|
|
2066
|
+
|
|
2067
|
+
<label for="node-input-staleTimeoutMs"><i class="fa fa-shield"></i> Stale Timeout (ms)</label>
|
|
2068
|
+
|
|
2069
|
+
|
|
2070
|
+
<input type="text" id="node-input-staleTimeoutMs" placeholder="5000">
|
|
2071
|
+
|
|
2072
|
+
|
|
2073
|
+
</div>
|
|
2074
|
+
|
|
2075
|
+
|
|
2076
|
+
|
|
2077
|
+
<div class="form-row">
|
|
2078
|
+
|
|
2079
|
+
|
|
2080
|
+
<label for="node-input-safeLimitOnStale"><i class="fa fa-life-ring"></i> Safe Limit on Stale (VAr)</label>
|
|
2081
|
+
|
|
2082
|
+
|
|
2083
|
+
<input type="text" id="node-input-safeLimitOnStale" placeholder="0">
|
|
2084
|
+
|
|
2085
|
+
|
|
2086
|
+
</div>
|
|
2087
|
+
|
|
2088
|
+
|
|
2089
|
+
|
|
2090
|
+
<div class="form-row">
|
|
2091
|
+
|
|
2092
|
+
|
|
2093
|
+
<label for="node-input-debugLevel"><i class="fa fa-bug"></i> Debug</label>
|
|
2094
|
+
|
|
2095
|
+
|
|
2096
|
+
<select id="node-input-debugLevel">
|
|
2097
|
+
|
|
2098
|
+
|
|
2099
|
+
<option value="off">Off</option>
|
|
2100
|
+
|
|
2101
|
+
|
|
2102
|
+
<option value="normal">Normal</option>
|
|
2103
|
+
|
|
2104
|
+
|
|
2105
|
+
<option value="verbose">Verbose</option>
|
|
2106
|
+
|
|
2107
|
+
|
|
2108
|
+
</select>
|
|
2109
|
+
|
|
2110
|
+
|
|
2111
|
+
</div>
|
|
2112
|
+
|
|
2113
|
+
|
|
2114
|
+
|
|
2115
|
+
<div class="form-row">
|
|
2116
|
+
|
|
2117
|
+
|
|
2118
|
+
<label for="node-input-startLimitMode"><i class="fa fa-play"></i> Start Limit</label>
|
|
2119
|
+
|
|
2120
|
+
|
|
2121
|
+
<select id="node-input-startLimitMode">
|
|
2122
|
+
|
|
2123
|
+
|
|
2124
|
+
<option value="zero">Start from 0</option>
|
|
2125
|
+
|
|
2126
|
+
|
|
2127
|
+
<option value="last_limit">Start from Last Limit</option>
|
|
2128
|
+
|
|
2129
|
+
|
|
2130
|
+
</select>
|
|
2131
|
+
|
|
2132
|
+
|
|
2133
|
+
</div>
|
|
2134
|
+
|
|
2135
|
+
|
|
2136
|
+
|
|
2137
|
+
<div class="form-row pr-checkbox-row" id="row-fail-secure-enabled">
|
|
2138
|
+
|
|
2139
|
+
|
|
2140
|
+
<label for="node-input-failSecureEnabled"><i class="fa fa-exclamation-triangle"></i> Fail Secure</label>
|
|
2141
|
+
|
|
2142
|
+
|
|
2143
|
+
<input type="checkbox" id="node-input-failSecureEnabled">
|
|
2144
|
+
|
|
2145
|
+
|
|
2146
|
+
</div>
|
|
2147
|
+
|
|
2148
|
+
|
|
2149
|
+
|
|
2150
|
+
<div class="form-row" id="row-fail-secure-time" style="display:none;">
|
|
2151
|
+
|
|
2152
|
+
|
|
2153
|
+
<label for="node-input-failSecureTimeSec"><i class="fa fa-clock-o"></i> Fail Secure Time (s)</label>
|
|
2154
|
+
|
|
2155
|
+
|
|
2156
|
+
<input type="text" id="node-input-failSecureTimeSec" placeholder="10">
|
|
2157
|
+
|
|
2158
|
+
|
|
2159
|
+
</div>
|
|
2160
|
+
|
|
2161
|
+
|
|
2162
|
+
</div>
|
|
2163
|
+
|
|
2164
|
+
|
|
2165
|
+
|
|
2166
|
+
<div class="form-row" id="node-control-reactive-validation" style="display:none;"></div>
|
|
2167
|
+
|
|
2168
|
+
|
|
2169
|
+
</div>
|
|
2170
|
+
|
|
2171
|
+
|
|
2172
|
+
</div>
|
|
2173
|
+
|
|
2174
|
+
|
|
2175
|
+
</script>
|
|
2176
|
+
|
|
2177
|
+
|
|
2178
|
+
|
|
2179
|
+
<script type="text/html" data-help-name="control-reactive">
|
|
2180
|
+
|
|
2181
|
+
<p>
|
|
2182
|
+
|
|
2183
|
+
Nodul <b>control-reactive</b> calculeaza o comanda de putere reactiva pentru invertor sau pentru
|
|
2184
|
+
|
|
2185
|
+
un sistem cu mai multe invertoare. Functioneaza similar cu <code>control-export</code>, dar foloseste
|
|
2186
|
+
|
|
2187
|
+
masuratori reactive in <b>VAr</b> si emite <code>payload.limit_var</code>.
|
|
2188
|
+
|
|
2189
|
+
</p>
|
|
2190
|
+
|
|
2191
|
+
|
|
2192
|
+
<pre>carlo-gavazzi -> control-reactive -> fronius-write</pre>
|
|
2193
|
+
|
|
2194
|
+
<pre>carlo-gavazzi -> control-reactive -> multi-inverter -> fronius-write</pre>
|
|
2195
|
+
|
|
2196
|
+
|
|
2197
|
+
<p>
|
|
2198
|
+
|
|
2199
|
+
Nodul nu citeste direct meterul si nu scrie direct registrii Modbus ai invertorului. El primeste
|
|
2200
|
+
|
|
2201
|
+
telemetrie reactiva, calculeaza limita in VAr si o trimite catre nodul urmator.
|
|
2202
|
+
|
|
2203
|
+
</p>
|
|
2204
|
+
|
|
2205
|
+
|
|
2206
|
+
<h3>Input acceptat</h3>
|
|
2207
|
+
|
|
2208
|
+
<p>
|
|
2209
|
+
|
|
2210
|
+
Pentru modurile de bucla inchisa, payload-ul trebuie sa contina puterea reactiva totala si puterea
|
|
2211
|
+
|
|
2212
|
+
reactiva pe fiecare faza. Formatul compact emis de <code>carlo-gavazzi</code> in modul
|
|
2213
|
+
|
|
2214
|
+
<b>Control export/reactive</b> este compatibil direct.
|
|
2215
|
+
|
|
2216
|
+
</p>
|
|
2217
|
+
|
|
2218
|
+
|
|
2219
|
+
<pre>{
|
|
2220
|
+
|
|
2221
|
+
"topic": "meter1",
|
|
2222
|
+
|
|
2223
|
+
"payload": {
|
|
2224
|
+
|
|
2225
|
+
"reactive_total_var": 420,
|
|
2226
|
+
|
|
2227
|
+
"reactive_l1_var": 120,
|
|
2228
|
+
|
|
2229
|
+
"reactive_l2_var": 150,
|
|
2230
|
+
|
|
2231
|
+
"reactive_l3_var": 150
|
|
2232
|
+
|
|
2233
|
+
}
|
|
2234
|
+
|
|
2235
|
+
}</pre>
|
|
2236
|
+
|
|
2237
|
+
|
|
2238
|
+
<p>Nodul mai accepta si campuri echivalente:</p>
|
|
2239
|
+
|
|
2240
|
+
|
|
2241
|
+
<ul>
|
|
2242
|
+
|
|
2243
|
+
<li><code>q_total_var</code>, <code>grid_reactive_power_var</code>, <code>reactive_power_var</code></li>
|
|
2244
|
+
|
|
2245
|
+
<li><code>q_l1_var</code>, <code>q_l2_var</code>, <code>q_l3_var</code></li>
|
|
2246
|
+
|
|
2247
|
+
<li><code>summary.reactive.total_var</code>, <code>summary.reactive.l1_var/l2_var/l3_var</code></li>
|
|
2248
|
+
|
|
2249
|
+
<li><code>reactive_power.total_var</code>, <code>reactive_power.l1_var/l2_var/l3_var</code></li>
|
|
2250
|
+
|
|
2251
|
+
</ul>
|
|
2252
|
+
|
|
2253
|
+
|
|
2254
|
+
<p>
|
|
2255
|
+
|
|
2256
|
+
Daca lipseste una dintre cele patru valori reactive necesare, nodul raporteaza eroare si nu calculeaza
|
|
2257
|
+
|
|
2258
|
+
o comanda noua.
|
|
2259
|
+
|
|
2260
|
+
</p>
|
|
2261
|
+
|
|
2262
|
+
|
|
2263
|
+
<h3>Timestamp</h3>
|
|
2264
|
+
|
|
2265
|
+
<p>
|
|
2266
|
+
|
|
2267
|
+
Pentru verificarea vechimii masurarii, nodul foloseste <code>msg.timestamp</code>, <code>msg.ts</code>,
|
|
2268
|
+
|
|
2269
|
+
<code>msg.time</code> sau variantele echivalente din <code>msg.payload</code>, inclusiv
|
|
2270
|
+
|
|
2271
|
+
<code>timestamp_ms</code> si <code>time_ms</code>. Daca nu exista timestamp, se foloseste timpul curent.
|
|
2272
|
+
|
|
2273
|
+
</p>
|
|
2274
|
+
|
|
2275
|
+
|
|
2276
|
+
<h3>Moduri de lucru</h3>
|
|
2277
|
+
|
|
2278
|
+
<h4>Zero Feed-In</h4>
|
|
2279
|
+
|
|
2280
|
+
<p>Modul <b>Zero Feed-In</b> urmareste tinta <code>0 VAr</code>.</p>
|
|
2281
|
+
|
|
2282
|
+
<ul>
|
|
2283
|
+
|
|
2284
|
+
<li><b>0 Relativ</b> foloseste <code>reactive_total_var</code>.</li>
|
|
2285
|
+
|
|
2286
|
+
<li><b>0 Absolut</b> foloseste faza cu modulul cel mai mic dintre L1, L2 si L3.</li>
|
|
2287
|
+
|
|
2288
|
+
</ul>
|
|
2289
|
+
|
|
2290
|
+
|
|
2291
|
+
<h4>Grid Set Point</h4>
|
|
2292
|
+
|
|
2293
|
+
<p>
|
|
2294
|
+
|
|
2295
|
+
Modul <b>Grid Set Point</b> urmareste valoarea introdusa la <b>Grid Target (VAr)</b>.
|
|
2296
|
+
|
|
2297
|
+
Foloseste acest mod cand vrei o tinta reactiva diferita de zero.
|
|
2298
|
+
|
|
2299
|
+
</p>
|
|
2300
|
+
|
|
2301
|
+
|
|
2302
|
+
<h4>Nominal Reactive Power</h4>
|
|
2303
|
+
|
|
2304
|
+
<p>
|
|
2305
|
+
|
|
2306
|
+
Modul <b>Nominal Reactive Power</b> trimite valoarea fixa din <b>Fixed Reactive Power (VAr)</b>,
|
|
2307
|
+
|
|
2308
|
+
limitata intre <code>-Max Q</code> si <code>+Max Q</code>. In acest mod nu se foloseste feedback-ul
|
|
2309
|
+
|
|
2310
|
+
din meter pentru reglaj.
|
|
2311
|
+
|
|
2312
|
+
</p>
|
|
2313
|
+
|
|
2314
|
+
|
|
2315
|
+
<h3>Teste A3 prin Modbus TCP</h3>
|
|
2316
|
+
|
|
2317
|
+
<p>
|
|
2318
|
+
|
|
2319
|
+
Cand <b>Teste A3</b> este activ, nodul porneste un server Modbus TCP si trece automat in
|
|
2320
|
+
|
|
2321
|
+
<b>Nominal Reactive Power</b>. Comenzile primite prin Modbus schimba comanda reactiva fixa,
|
|
2322
|
+
|
|
2323
|
+
tipul de rampa si valoarea rampei, apoi nodul emite imediat o comanda noua.
|
|
2324
|
+
|
|
2325
|
+
</p>
|
|
2326
|
+
|
|
2327
|
+
<h4>Setari recomandate pe dispozitivul testat</h4>
|
|
2328
|
+
|
|
2329
|
+
<ul>
|
|
2330
|
+
|
|
2331
|
+
<li><b>Teste A3</b>: activ</li>
|
|
2332
|
+
|
|
2333
|
+
<li><b>A3 Host</b>: <code>0.0.0.0</code> cand comanda vine de pe alt dispozitiv; <code>127.0.0.1</code> doar pentru test local pe acelasi dispozitiv</li>
|
|
2334
|
+
|
|
2335
|
+
<li><b>A3 Port</b>: <code>1503</code> pentru <code>control-reactive</code></li>
|
|
2336
|
+
|
|
2337
|
+
<li><b>A3 Unit ID</b>: <code>1</code></li>
|
|
2338
|
+
|
|
2339
|
+
<li><b>Max Q (+/-VAr)</b>: limita absoluta maxima acceptata, de exemplu <code>25000</code>. O comanda mai mare este taiata automat intre <code>-Max Q</code> si <code>+Max Q</code>.</li>
|
|
2340
|
+
|
|
2341
|
+
</ul>
|
|
2342
|
+
|
|
2343
|
+
<h4>Harta registrelor A3</h4>
|
|
2344
|
+
|
|
2345
|
+
<ul>
|
|
2346
|
+
|
|
2347
|
+
<li><code>0</code>: versiune profil, read-only, valoare <code>1</code></li>
|
|
2348
|
+
|
|
2349
|
+
<li><code>1</code>: enabled, read-only, valoare <code>1</code></li>
|
|
2350
|
+
|
|
2351
|
+
<li><code>2-3</code>: nominal reactive power in VAr, <code>int32</code>, big-endian word order. Poate fi pozitiv sau negativ.</li>
|
|
2352
|
+
|
|
2353
|
+
<li><code>4</code>: ramp type, <code>uint16</code>: <code>0</code> none, <code>1</code> time, <code>2</code> gradient %/s, <code>3</code> gradient VAr/s</li>
|
|
2354
|
+
|
|
2355
|
+
<li><code>5-6</code>: ramp value, <code>int32</code>, big-endian word order</li>
|
|
2356
|
+
|
|
2357
|
+
<li><code>7</code>: sequence, read-only, creste la fiecare comanda Modbus acceptata</li>
|
|
2358
|
+
|
|
2359
|
+
<li><code>8</code>: timestamp scurt al ultimei comenzi, read-only</li>
|
|
2360
|
+
|
|
2361
|
+
</ul>
|
|
2362
|
+
|
|
2363
|
+
<p>
|
|
2364
|
+
|
|
2365
|
+
Sunt acceptate functiile Modbus <code>03</code> / <code>04</code> pentru citire si <code>06</code> /
|
|
2366
|
+
|
|
2367
|
+
<code>16</code> pentru scriere. Pentru o comanda completa se recomanda <code>FC16</code> pe registrele
|
|
2368
|
+
|
|
2369
|
+
<code>2-6</code>.
|
|
2370
|
+
|
|
2371
|
+
</p>
|
|
2372
|
+
|
|
2373
|
+
<h4>Exemplu comanda A3</h4>
|
|
2374
|
+
|
|
2375
|
+
<p>
|
|
2376
|
+
|
|
2377
|
+
Pentru a trimite <code>2500 VAr</code> fara rampa, scrie cu <code>FC16</code> de la registrul
|
|
2378
|
+
|
|
2379
|
+
<code>2</code>, cantitate <code>5</code>, valorile:
|
|
2380
|
+
|
|
2381
|
+
</p>
|
|
2382
|
+
|
|
2383
|
+
<pre>reg 2 = 0
|
|
2384
|
+
reg 3 = 2500
|
|
2385
|
+
reg 4 = 0
|
|
2386
|
+
reg 5 = 0
|
|
2387
|
+
reg 6 = 0</pre>
|
|
2388
|
+
|
|
2389
|
+
<p>
|
|
2390
|
+
|
|
2391
|
+
Pentru <code>-2500 VAr</code>, valoarea <code>int32</code> se scrie in complement fata de 2:
|
|
2392
|
+
|
|
2393
|
+
</p>
|
|
2394
|
+
|
|
2395
|
+
<pre>reg 2 = 65535
|
|
2396
|
+
reg 3 = 63036
|
|
2397
|
+
reg 4 = 0
|
|
2398
|
+
reg 5 = 0
|
|
2399
|
+
reg 6 = 0</pre>
|
|
2400
|
+
|
|
2401
|
+
<p>
|
|
2402
|
+
|
|
2403
|
+
Pentru <code>8000 VAr</code> cu rampa de timp <code>10 s</code>:
|
|
2404
|
+
|
|
2405
|
+
</p>
|
|
2406
|
+
|
|
2407
|
+
<pre>reg 2 = 0
|
|
2408
|
+
reg 3 = 8000
|
|
2409
|
+
reg 4 = 1
|
|
2410
|
+
reg 5 = 0
|
|
2411
|
+
reg 6 = 10</pre>
|
|
2412
|
+
|
|
2413
|
+
<p>
|
|
2414
|
+
|
|
2415
|
+
Output-ul asteptat dupa comanda:
|
|
2416
|
+
|
|
2417
|
+
</p>
|
|
2418
|
+
|
|
2419
|
+
<pre>{
|
|
2420
|
+
"payload": {
|
|
2421
|
+
"powerType": "reactive",
|
|
2422
|
+
"mode": "vars",
|
|
2423
|
+
"limit_var": 2500,
|
|
2424
|
+
"a3_tests": true,
|
|
2425
|
+
"ramp": { "type": "none", "value": 0 }
|
|
2426
|
+
}
|
|
2427
|
+
}</pre>
|
|
2428
|
+
|
|
2429
|
+
<p>
|
|
2430
|
+
|
|
2431
|
+
Campurile din editorul nodului sunt configuratie initiala si nu se actualizeaza live cand vine o
|
|
2432
|
+
|
|
2433
|
+
comanda Modbus. Pentru confirmare, citeste registrele <code>0-8</code> sau pune un nod <code>debug</code>
|
|
2434
|
+
|
|
2435
|
+
pe iesirea <code>control-reactive</code>.
|
|
2436
|
+
|
|
2437
|
+
</p>
|
|
2438
|
+
|
|
2439
|
+
|
|
2440
|
+
<h3>Max Q</h3>
|
|
2441
|
+
|
|
2442
|
+
<p>
|
|
2443
|
+
|
|
2444
|
+
<b>Max Q (+/-VAr)</b> este limita absoluta maxima pentru comanda reactiva. Nodul nu va emite o valoare
|
|
2445
|
+
|
|
2446
|
+
mai mare decat <code>+Max Q</code> sau mai mica decat <code>-Max Q</code>.
|
|
2447
|
+
|
|
2448
|
+
</p>
|
|
2449
|
+
|
|
2450
|
+
|
|
2451
|
+
<h3>Tuning</h3>
|
|
2452
|
+
|
|
2453
|
+
<ul>
|
|
2454
|
+
|
|
2455
|
+
<li><b>Deadband (VAr)</b> este zona in care eroarea este considerata suficient de mica.</li>
|
|
2456
|
+
|
|
2457
|
+
<li><b>Command Deadband (VAr)</b> evita retrimiterea comenzilor foarte apropiate de ultima comanda.</li>
|
|
2458
|
+
|
|
2459
|
+
<li><b>Filter Tau (ms)</b> filtreaza masurarea reactiva; valori mai mari inseamna reactie mai calma.</li>
|
|
2460
|
+
|
|
2461
|
+
<li><b>Noise Threshold (VAr)</b> defineste pragul peste care variatia este tratata ca zgomot relevant.</li>
|
|
2462
|
+
|
|
2463
|
+
<li><b>Control Period (ms)</b> este perioada de calcul a regulatorului.</li>
|
|
2464
|
+
|
|
2465
|
+
<li><b>Min Command Interval (ms)</b> impune distanta minima intre doua comenzi trimise.</li>
|
|
2466
|
+
|
|
2467
|
+
<li><b>Settle After Command (ms)</b> lasa sistemul sa se stabilizeze dupa o comanda.</li>
|
|
2468
|
+
|
|
2469
|
+
<li><b>Noise Release (ms)</b> asteapta o perioada stabila inainte de a elibera blocarea de zgomot.</li>
|
|
2470
|
+
|
|
2471
|
+
<li><b>Transient Ignore (ms)</b> ignora abaterile care dureaza prea putin.</li>
|
|
2472
|
+
|
|
2473
|
+
<li><b>Kp</b> si <b>Ki</b> controleaza reactia proportionala si integrala.</li>
|
|
2474
|
+
|
|
2475
|
+
<li><b>Max Step Up/Down (VAr/cycle)</b> limiteaza cat se poate modifica limita la un ciclu.</li>
|
|
2476
|
+
|
|
2477
|
+
<li><b>Adaptive Gains</b> poate reduce castigurile cand eroarea este mica.</li>
|
|
2478
|
+
|
|
2479
|
+
</ul>
|
|
2480
|
+
|
|
2481
|
+
|
|
2482
|
+
<h3>Safety si fallback</h3>
|
|
2483
|
+
|
|
2484
|
+
<ul>
|
|
2485
|
+
|
|
2486
|
+
<li><b>Stale Timeout (ms)</b> decide cand telemetria este prea veche.</li>
|
|
2487
|
+
|
|
2488
|
+
<li><b>Safe Limit on Stale (VAr)</b> este comanda trimisa cand telemetria este stale.</li>
|
|
2489
|
+
|
|
2490
|
+
<li><b>Start Limit</b> permite pornirea de la ultima limita salvata.</li>
|
|
2491
|
+
|
|
2492
|
+
<li><b>Fail Secure</b> adauga a doua iesire si semnalizeaza cand nodul ramane la limita maxima prea mult timp.</li>
|
|
2493
|
+
|
|
2494
|
+
</ul>
|
|
2495
|
+
|
|
2496
|
+
|
|
2497
|
+
<h3>Comenzi start/stop</h3>
|
|
2498
|
+
|
|
2499
|
+
<ul>
|
|
2500
|
+
|
|
2501
|
+
<li><code>msg.topic = "start"</code> porneste controlul si reface starea initiala.</li>
|
|
2502
|
+
|
|
2503
|
+
<li><code>msg.topic = "stop"</code> opreste controlul si trimite imediat <code>limit_var = 0</code>.</li>
|
|
2504
|
+
|
|
2505
|
+
</ul>
|
|
2506
|
+
|
|
2507
|
+
|
|
2508
|
+
<h3>Output principal</h3>
|
|
2509
|
+
|
|
2510
|
+
<p>
|
|
2511
|
+
|
|
2512
|
+
Iesirea principala este compatibila cu <code>fronius-write</code> si cu <code>multi-inverter</code>.
|
|
2513
|
+
|
|
2514
|
+
Topic-ul implicit este <code>control-reactive</code>.
|
|
2515
|
+
|
|
2516
|
+
</p>
|
|
2517
|
+
|
|
2518
|
+
|
|
2519
|
+
<pre>{
|
|
2520
|
+
|
|
2521
|
+
"topic": "control-reactive",
|
|
2522
|
+
|
|
2523
|
+
"payload": {
|
|
2524
|
+
|
|
2525
|
+
"powerType": "reactive",
|
|
2526
|
+
|
|
2527
|
+
"mode": "vars",
|
|
2528
|
+
|
|
2529
|
+
"limit_var": 2500,
|
|
2530
|
+
|
|
2531
|
+
"ramp": {
|
|
2532
|
+
|
|
2533
|
+
"type": "time",
|
|
2534
|
+
|
|
2535
|
+
"value": 9
|
|
2536
|
+
|
|
2537
|
+
},
|
|
2538
|
+
|
|
2539
|
+
"grid_reference_var": 420,
|
|
2540
|
+
|
|
2541
|
+
"grid_target_var": 0,
|
|
2542
|
+
|
|
2543
|
+
"reason": "tracking",
|
|
2544
|
+
|
|
2545
|
+
"controller_state": "tracking",
|
|
2546
|
+
|
|
2547
|
+
"stale": false,
|
|
2548
|
+
|
|
2549
|
+
"timestamp_ms": 1776692400000
|
|
2550
|
+
|
|
2551
|
+
}
|
|
2552
|
+
|
|
2553
|
+
}</pre>
|
|
2554
|
+
|
|
2555
|
+
|
|
2556
|
+
<h3>Campuri importante din output</h3>
|
|
2557
|
+
|
|
2558
|
+
<ul>
|
|
2559
|
+
|
|
2560
|
+
<li><code>limit_var</code> este comanda reactiva calculata.</li>
|
|
2561
|
+
|
|
2562
|
+
<li><code>grid_reference_var</code> este masurarea reactiva folosita de control.</li>
|
|
2563
|
+
|
|
2564
|
+
<li><code>grid_target_var</code> este tinta urmarita.</li>
|
|
2565
|
+
|
|
2566
|
+
<li><code>reason</code> explica de ce a fost emisa comanda curenta.</li>
|
|
2567
|
+
|
|
2568
|
+
<li><code>controller_state</code> arata starea interna a regulatorului.</li>
|
|
2569
|
+
|
|
2570
|
+
<li><code>stale</code> devine <code>true</code> cand se foloseste fallback.</li>
|
|
2571
|
+
|
|
2572
|
+
<li><code>ramp</code> este generata automat din intervalul minim de comanda.</li>
|
|
2573
|
+
|
|
2574
|
+
</ul>
|
|
2575
|
+
|
|
2576
|
+
|
|
2577
|
+
<h3>Debug</h3>
|
|
2578
|
+
|
|
2579
|
+
<p>
|
|
2580
|
+
|
|
2581
|
+
Cu debug <b>Normal</b>, payload-ul include valori precum <code>raw_grid_reference_var</code>,
|
|
2582
|
+
|
|
2583
|
+
<code>filtered_grid_reference_var</code>, <code>error_var</code>, <code>correction_var</code>,
|
|
2584
|
+
|
|
2585
|
+
<code>control_active</code>, <code>ramp_direction</code>, <code>clamped_by_min</code>,
|
|
2586
|
+
|
|
2587
|
+
<code>clamped_by_max</code> si <code>measurement_age_ms</code>.
|
|
2588
|
+
|
|
2589
|
+
</p>
|
|
2590
|
+
|
|
2591
|
+
|
|
2592
|
+
<p>
|
|
2593
|
+
|
|
2594
|
+
Cu debug <b>Verbose</b>, apar si termenii PI, castigurile efective si parametrii de tuning folositi.
|
|
2595
|
+
|
|
2596
|
+
</p>
|
|
2597
|
+
|
|
2598
|
+
|
|
2599
|
+
<h3>Fail Secure</h3>
|
|
2600
|
+
|
|
2601
|
+
<p>
|
|
2602
|
+
|
|
2603
|
+
Cand <b>Fail Secure</b> este activ, a doua iesire trimite <code>payload = 1</code> daca limita ramane
|
|
2604
|
+
|
|
2605
|
+
la <code>+/-Max Q</code> mai mult decat timpul configurat.
|
|
2606
|
+
|
|
2607
|
+
</p>
|
|
2608
|
+
|
|
2609
|
+
|
|
2610
|
+
<pre>{
|
|
2611
|
+
|
|
2612
|
+
"topic": "control-reactive/fail-secure",
|
|
2613
|
+
|
|
2614
|
+
"payload": 1,
|
|
2615
|
+
|
|
2616
|
+
"fail_secure": {
|
|
2617
|
+
|
|
2618
|
+
"active": true,
|
|
2619
|
+
|
|
2620
|
+
"duration_ms": 12000,
|
|
2621
|
+
|
|
2622
|
+
"nominal_reactive_power_var": 25000,
|
|
2623
|
+
|
|
2624
|
+
"site_limit_var": 25000,
|
|
2625
|
+
|
|
2626
|
+
"timeout_s": 10
|
|
2627
|
+
|
|
2628
|
+
}
|
|
2629
|
+
|
|
2630
|
+
}</pre>
|
|
2631
|
+
|
|
2632
|
+
|
|
2633
|
+
<h3>Status in editor</h3>
|
|
2634
|
+
|
|
2635
|
+
<ul>
|
|
2636
|
+
|
|
2637
|
+
<li><b>verde</b> inseamna control activ.</li>
|
|
2638
|
+
|
|
2639
|
+
<li><b>albastru</b> inseamna nominal, deadband, hold sau asteptare.</li>
|
|
2640
|
+
|
|
2641
|
+
<li><b>galben</b> inseamna telemetrie stale sau fallback.</li>
|
|
2642
|
+
|
|
2643
|
+
<li><b>gri</b> inseamna control oprit.</li>
|
|
2644
|
+
|
|
2645
|
+
<li><b>rosu</b> inseamna eroare sau stop cu trimitere Q=0.</li>
|
|
2646
|
+
|
|
2647
|
+
</ul>
|
|
2648
|
+
|
|
2649
|
+
|
|
2650
|
+
<h3>Recomandari practice</h3>
|
|
2651
|
+
|
|
2652
|
+
<ul>
|
|
2653
|
+
|
|
2654
|
+
<li>Foloseste <code>carlo-gavazzi</code> in modul <b>Control export/reactive</b> pentru input complet.</li>
|
|
2655
|
+
|
|
2656
|
+
<li>Verifica semnul puterii reactive inainte sa activezi controlul real.</li>
|
|
2657
|
+
|
|
2658
|
+
<li>Daca apar oscilatii, mareste <code>Deadband</code> sau <code>Filter Tau</code> si scade <code>Kp</code>.</li>
|
|
2659
|
+
|
|
2660
|
+
<li>Daca nodul retrimite prea des, mareste <code>Command Deadband</code> sau <code>Min Command Interval</code>.</li>
|
|
2661
|
+
|
|
2662
|
+
<li>Pentru mai multe invertoare, trimite outputul in <code>multi-inverter</code>, apoi catre nodurile <code>fronius-write</code>.</li>
|
|
2663
|
+
|
|
2664
|
+
</ul>
|
|
2665
|
+
|
|
2666
|
+
<h3>Referinta completa parametri</h3>
|
|
2667
|
+
<ul>
|
|
2668
|
+
<li><code>mode</code>: Zero Feed-In, Grid Set Point sau Nominal Reactive Power.</li>
|
|
2669
|
+
<li><code>zeroFeedInMode</code>: relativ pe total sau absolut pe faza limitativa.</li>
|
|
2670
|
+
<li><code>tuningPreset</code>: preset de reglaj; <code>stable_grid</code> reduce oscilatiile la telemetrie rapida.</li>
|
|
2671
|
+
<li><code>gridSetPointVar</code>: tinta reactiva in VAr pentru Grid Set Point.</li>
|
|
2672
|
+
<li><code>nominalReactivePowerVar</code>: limita maxima absoluta Q in VAr.</li>
|
|
2673
|
+
<li><code>fixedReactivePowerVar</code>: comanda fixa pentru Nominal Reactive Power.</li>
|
|
2674
|
+
<li><code>fixedReactivePowerFromGlobal</code> si <code>fixedReactivePowerGlobalVar</code>: citesc comanda fixa din context global.</li>
|
|
2675
|
+
<li><code>nominalReactivePowerFromGlobal</code> si <code>nominalReactivePowerGlobalVar</code>: citesc Max Q din context global.</li>
|
|
2676
|
+
<li><code>a3TestsEnabled</code>: porneste serverul Modbus TCP pentru teste A3 si forteaza modul Nominal Reactive Power.</li>
|
|
2677
|
+
<li><code>a3ModbusHost</code>: interfata pe care asculta serverul A3; foloseste <code>0.0.0.0</code> pentru acces din retea.</li>
|
|
2678
|
+
<li><code>a3ModbusPort</code>: portul serverului A3, implicit <code>1503</code>.</li>
|
|
2679
|
+
<li><code>a3ModbusUnitId</code>: Unit ID Modbus acceptat, implicit <code>1</code>.</li>
|
|
2680
|
+
<li><code>a3RampType</code> si <code>a3RampValue</code>: valorile initiale de rampa pana la prima comanda Modbus.</li>
|
|
2681
|
+
<li><code>deadbandVar</code>: zona moarta a erorii reactive.</li>
|
|
2682
|
+
<li><code>commandDeadbandVar</code>: diferenta minima fata de ultima comanda pentru a retrimite output.</li>
|
|
2683
|
+
<li><code>filterTauMs</code>: filtrarea masurarii reactive.</li>
|
|
2684
|
+
<li><code>noiseThresholdVar</code>, <code>noiseReleaseMs</code>: detectie si eliberare zgomot.</li>
|
|
2685
|
+
<li><code>kp</code> si <code>ki</code>: castigurile regulatorului PI.</li>
|
|
2686
|
+
<li><code>controlPeriodMs</code>: perioada minima intre calcule.</li>
|
|
2687
|
+
<li><code>minCommandIntervalMs</code>: distanta minima intre comenzi emise.</li>
|
|
2688
|
+
<li><code>settleAfterCommandMs</code>: timp de asteptare dupa comanda.</li>
|
|
2689
|
+
<li><code>transientIgnoreMs</code>: ignora tranzienti scurti.</li>
|
|
2690
|
+
<li><code>maxStepUpVar</code> si <code>maxStepDownVar</code>: pas maxim de crestere/scadere pe ciclu.</li>
|
|
2691
|
+
<li><code>adaptiveGains</code>, <code>adaptiveErrorBandVar</code>, <code>adaptiveMinScale</code>: castiguri adaptive la erori mici.</li>
|
|
2692
|
+
<li><code>maxStepVar</code>: compatibilitate legacy pentru pas maxim simetric.</li>
|
|
2693
|
+
<li><code>staleTimeoutMs</code> si <code>maxFutureTimestampMs</code>: validarea vechimii telemetriei.</li>
|
|
2694
|
+
<li><code>safeLimitOnStale</code>: comanda Q folosita cand telemetria este stale.</li>
|
|
2695
|
+
<li><code>debugLevel</code>: nivelul de diagnostic inclus in payload.</li>
|
|
2696
|
+
<li><code>startLimitMode</code>: limita initiala dupa restart/deploy.</li>
|
|
2697
|
+
<li><code>outputTopic</code>: topic-ul mesajului principal.</li>
|
|
2698
|
+
<li><code>failSecureEnabled</code> si <code>failSecureTimeSec</code>: a doua iesire de protectie cand limita ramane saturata.</li>
|
|
2699
|
+
</ul>
|
|
2700
|
+
|
|
2701
|
+
<h3>Exemplu Grid Set Point reactiv</h3>
|
|
2702
|
+
<pre>{
|
|
2703
|
+
"payload": {
|
|
2704
|
+
"reactive_total_var": 650,
|
|
2705
|
+
"reactive_l1_var": 210,
|
|
2706
|
+
"reactive_l2_var": 220,
|
|
2707
|
+
"reactive_l3_var": 220,
|
|
2708
|
+
"timestamp_ms": 1776692400000
|
|
2709
|
+
}
|
|
2710
|
+
}</pre>
|
|
2711
|
+
<p>Cu <code>mode = grid_set_point</code> si <code>gridSetPointVar = 0</code>, nodul calculeaza <code>limit_var</code> pentru a aduce schimbul reactiv spre zero.</p>
|
|
2712
|
+
|
|
2713
|
+
</script>
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
<script type="text/html" data-help-name="control-reactive-legacy">
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
<p>Nodul <b>control-reactive</b> controleaza puterea reactiva (VAr) cu aceeasi structura de reglaj ca <b>control-export</b>: PI periodic, filtrare, deadband, ramp limits, fallback stale si fail-secure optional.</p>
|
|
2720
|
+
|
|
2721
|
+
|
|
2722
|
+
<pre>carlo-gavazzi -> control-reactive -> fronius-write</pre>
|
|
2723
|
+
|
|
2724
|
+
|
|
2725
|
+
<p>Input strict pentru modurile de bucla inchisa: payload-ul meter trebuie sa contina toate cele 4 valori <code>reactive_l1_var</code>, <code>reactive_l2_var</code>, <code>reactive_l3_var</code>, <code>reactive_total_var</code>. Daca lipsesc, nodul raporteaza eroare si nu calculeaza limita.</p>
|
|
2726
|
+
|
|
2727
|
+
|
|
2728
|
+
<p><b>Zero Feed-In</b> suporta doua referinte: <b>0 Relativ</b> (foloseste <code>reactive_total_var</code>) si <b>0 Absolut</b> (foloseste faza cu modulul minim dintre L1/L2/L3).</p>
|
|
2729
|
+
|
|
2730
|
+
|
|
2731
|
+
<p>Mesajul de iesire ramane compatibil cu <code>fronius-write</code>:</p>
|
|
2732
|
+
|
|
2733
|
+
|
|
2734
|
+
<pre>{
|
|
2735
|
+
|
|
2736
|
+
|
|
2737
|
+
"topic": "control-reactive",
|
|
2738
|
+
|
|
2739
|
+
|
|
2740
|
+
"payload": {
|
|
2741
|
+
|
|
2742
|
+
|
|
2743
|
+
"powerType": "reactive",
|
|
2744
|
+
|
|
2745
|
+
|
|
2746
|
+
"mode": "vars",
|
|
2747
|
+
|
|
2748
|
+
|
|
2749
|
+
"limit_var": 2500
|
|
2750
|
+
|
|
2751
|
+
|
|
2752
|
+
}
|
|
2753
|
+
|
|
2754
|
+
|
|
2755
|
+
}</pre>
|
|
2756
|
+
|
|
2757
|
+
|
|
2758
|
+
<p>Comenzi speciale:</p>
|
|
2759
|
+
|
|
2760
|
+
|
|
2761
|
+
<ul>
|
|
2762
|
+
|
|
2763
|
+
|
|
2764
|
+
<li><code>topic=start</code> porneste controlul.</li>
|
|
2765
|
+
|
|
2766
|
+
|
|
2767
|
+
<li><code>topic=stop</code> opreste controlul si trimite <code>Q=0</code>.</li>
|
|
2768
|
+
|
|
2769
|
+
|
|
2770
|
+
</ul>
|
|
2771
|
+
|
|
2772
|
+
|
|
2773
|
+
</script>
|
|
2774
|
+
|
|
2775
|
+
|
|
2776
|
+
|
|
2777
|
+
<script type="text/html" data-help-name="reactive-control">
|
|
2778
|
+
|
|
2779
|
+
|
|
2780
|
+
<p>Nod legacy. Foloseste <b>control-reactive</b> pentru configuratii noi.</p>
|
|
2781
|
+
|
|
2782
|
+
|
|
2783
|
+
</script>
|
|
2784
|
+
|
|
2785
|
+
|
|
2786
|
+
|
|
2787
|
+
<style>
|
|
2788
|
+
|
|
2789
|
+
|
|
2790
|
+
.control-reactive-editor {
|
|
2791
|
+
|
|
2792
|
+
|
|
2793
|
+
--pr-border: #d7dde5;
|
|
2794
|
+
|
|
2795
|
+
|
|
2796
|
+
--pr-muted: #667085;
|
|
2797
|
+
|
|
2798
|
+
|
|
2799
|
+
--pr-surface: #f8fafc;
|
|
2800
|
+
|
|
2801
|
+
|
|
2802
|
+
--cr-invalid: #b94a48;
|
|
2803
|
+
|
|
2804
|
+
|
|
2805
|
+
--cr-warn: #8a6d3b;
|
|
2806
|
+
|
|
2807
|
+
|
|
2808
|
+
}
|
|
2809
|
+
|
|
2810
|
+
|
|
2811
|
+
|
|
2812
|
+
.control-reactive-editor .pr-section {
|
|
2813
|
+
|
|
2814
|
+
|
|
2815
|
+
margin: 0 0 18px;
|
|
2816
|
+
|
|
2817
|
+
|
|
2818
|
+
padding: 14px 16px 16px;
|
|
2819
|
+
|
|
2820
|
+
|
|
2821
|
+
border: 1px solid var(--pr-border);
|
|
2822
|
+
|
|
2823
|
+
|
|
2824
|
+
border-radius: 10px;
|
|
2825
|
+
|
|
2826
|
+
|
|
2827
|
+
background: var(--pr-surface);
|
|
2828
|
+
|
|
2829
|
+
|
|
2830
|
+
}
|
|
2831
|
+
|
|
2832
|
+
|
|
2833
|
+
|
|
2834
|
+
.control-reactive-editor .pr-section-title {
|
|
2835
|
+
|
|
2836
|
+
|
|
2837
|
+
display: flex;
|
|
2838
|
+
|
|
2839
|
+
|
|
2840
|
+
align-items: center;
|
|
2841
|
+
|
|
2842
|
+
|
|
2843
|
+
gap: 8px;
|
|
2844
|
+
|
|
2845
|
+
|
|
2846
|
+
margin: 0 0 4px;
|
|
2847
|
+
|
|
2848
|
+
|
|
2849
|
+
font-size: 15px;
|
|
2850
|
+
|
|
2851
|
+
|
|
2852
|
+
font-weight: 600;
|
|
2853
|
+
|
|
2854
|
+
|
|
2855
|
+
color: #243447;
|
|
2856
|
+
|
|
2857
|
+
|
|
2858
|
+
}
|
|
2859
|
+
|
|
2860
|
+
|
|
2861
|
+
|
|
2862
|
+
.control-reactive-editor .pr-section-note {
|
|
2863
|
+
|
|
2864
|
+
|
|
2865
|
+
margin: 0 0 14px;
|
|
2866
|
+
|
|
2867
|
+
|
|
2868
|
+
color: var(--pr-muted);
|
|
2869
|
+
|
|
2870
|
+
|
|
2871
|
+
font-size: 12px;
|
|
2872
|
+
|
|
2873
|
+
|
|
2874
|
+
line-height: 1.45;
|
|
2875
|
+
|
|
2876
|
+
|
|
2877
|
+
}
|
|
2878
|
+
|
|
2879
|
+
|
|
2880
|
+
|
|
2881
|
+
.control-reactive-editor .pr-grid {
|
|
2882
|
+
|
|
2883
|
+
|
|
2884
|
+
display: grid;
|
|
2885
|
+
|
|
2886
|
+
|
|
2887
|
+
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
|
2888
|
+
|
|
2889
|
+
|
|
2890
|
+
gap: 12px 16px;
|
|
2891
|
+
|
|
2892
|
+
|
|
2893
|
+
}
|
|
2894
|
+
|
|
2895
|
+
|
|
2896
|
+
|
|
2897
|
+
.control-reactive-editor .pr-grid-2 {
|
|
2898
|
+
|
|
2899
|
+
|
|
2900
|
+
grid-template-columns: repeat(2, minmax(320px, 1fr));
|
|
2901
|
+
|
|
2902
|
+
|
|
2903
|
+
}
|
|
2904
|
+
|
|
2905
|
+
|
|
2906
|
+
|
|
2907
|
+
.control-reactive-editor .pr-span-2 {
|
|
2908
|
+
|
|
2909
|
+
|
|
2910
|
+
grid-column: 1 / -1;
|
|
2911
|
+
|
|
2912
|
+
|
|
2913
|
+
}
|
|
2914
|
+
|
|
2915
|
+
|
|
2916
|
+
|
|
2917
|
+
.control-reactive-editor .form-row {
|
|
2918
|
+
|
|
2919
|
+
|
|
2920
|
+
margin-bottom: 12px;
|
|
2921
|
+
|
|
2922
|
+
|
|
2923
|
+
}
|
|
2924
|
+
|
|
2925
|
+
|
|
2926
|
+
|
|
2927
|
+
.control-reactive-editor .pr-grid .form-row,
|
|
2928
|
+
|
|
2929
|
+
|
|
2930
|
+
.control-reactive-editor .form-row:last-child {
|
|
2931
|
+
|
|
2932
|
+
|
|
2933
|
+
margin-bottom: 0;
|
|
2934
|
+
|
|
2935
|
+
|
|
2936
|
+
}
|
|
2937
|
+
|
|
2938
|
+
|
|
2939
|
+
|
|
2940
|
+
.control-reactive-editor .pr-checkbox-row {
|
|
2941
|
+
|
|
2942
|
+
|
|
2943
|
+
display: flex;
|
|
2944
|
+
|
|
2945
|
+
|
|
2946
|
+
align-items: center;
|
|
2947
|
+
|
|
2948
|
+
|
|
2949
|
+
justify-content: flex-start;
|
|
2950
|
+
|
|
2951
|
+
|
|
2952
|
+
gap: 8px;
|
|
2953
|
+
|
|
2954
|
+
|
|
2955
|
+
}
|
|
2956
|
+
|
|
2957
|
+
|
|
2958
|
+
|
|
2959
|
+
.control-reactive-editor .form-row > label {
|
|
2960
|
+
|
|
2961
|
+
|
|
2962
|
+
width: 170px;
|
|
2963
|
+
|
|
2964
|
+
|
|
2965
|
+
font-weight: 600;
|
|
2966
|
+
|
|
2967
|
+
|
|
2968
|
+
}
|
|
2969
|
+
|
|
2970
|
+
|
|
2971
|
+
|
|
2972
|
+
.control-reactive-editor .form-row > input[type="text"],
|
|
2973
|
+
|
|
2974
|
+
|
|
2975
|
+
.control-reactive-editor .form-row > input[type="number"],
|
|
2976
|
+
|
|
2977
|
+
|
|
2978
|
+
.control-reactive-editor .form-row > select {
|
|
2979
|
+
|
|
2980
|
+
|
|
2981
|
+
width: calc(100% - 180px);
|
|
2982
|
+
|
|
2983
|
+
|
|
2984
|
+
}
|
|
2985
|
+
|
|
2986
|
+
|
|
2987
|
+
|
|
2988
|
+
.control-reactive-editor .pr-checkbox-row > label {
|
|
2989
|
+
|
|
2990
|
+
|
|
2991
|
+
width: auto;
|
|
2992
|
+
|
|
2993
|
+
|
|
2994
|
+
margin: 0;
|
|
2995
|
+
|
|
2996
|
+
|
|
2997
|
+
flex: 0 0 auto;
|
|
2998
|
+
|
|
2999
|
+
|
|
3000
|
+
}
|
|
3001
|
+
|
|
3002
|
+
|
|
3003
|
+
|
|
3004
|
+
.control-reactive-editor .pr-checkbox-row > input[type="checkbox"] {
|
|
3005
|
+
|
|
3006
|
+
|
|
3007
|
+
width: auto;
|
|
3008
|
+
|
|
3009
|
+
|
|
3010
|
+
margin: 0;
|
|
3011
|
+
|
|
3012
|
+
|
|
3013
|
+
float: none;
|
|
3014
|
+
|
|
3015
|
+
|
|
3016
|
+
flex: 0 0 auto;
|
|
3017
|
+
|
|
3018
|
+
|
|
3019
|
+
}
|
|
3020
|
+
|
|
3021
|
+
|
|
3022
|
+
.control-reactive-editor .cr-meta-info {
|
|
3023
|
+
|
|
3024
|
+
|
|
3025
|
+
border: 1px solid #d8e1ea;
|
|
3026
|
+
|
|
3027
|
+
|
|
3028
|
+
border-radius: 6px;
|
|
3029
|
+
|
|
3030
|
+
|
|
3031
|
+
background: #f7fbff;
|
|
3032
|
+
|
|
3033
|
+
|
|
3034
|
+
color: #4b5563;
|
|
3035
|
+
|
|
3036
|
+
|
|
3037
|
+
padding: 8px 10px;
|
|
3038
|
+
|
|
3039
|
+
|
|
3040
|
+
line-height: 1.35;
|
|
3041
|
+
|
|
3042
|
+
|
|
3043
|
+
}
|
|
3044
|
+
|
|
3045
|
+
|
|
3046
|
+
|
|
3047
|
+
.control-reactive-editor #node-control-reactive-validation {
|
|
3048
|
+
|
|
3049
|
+
|
|
3050
|
+
margin-top: 8px;
|
|
3051
|
+
|
|
3052
|
+
|
|
3053
|
+
}
|
|
3054
|
+
|
|
3055
|
+
|
|
3056
|
+
|
|
3057
|
+
.control-reactive-editor .cr-validation-block {
|
|
3058
|
+
|
|
3059
|
+
|
|
3060
|
+
border-radius: 6px;
|
|
3061
|
+
|
|
3062
|
+
|
|
3063
|
+
padding: 8px 10px;
|
|
3064
|
+
|
|
3065
|
+
|
|
3066
|
+
margin-top: 6px;
|
|
3067
|
+
|
|
3068
|
+
|
|
3069
|
+
font-weight: 600;
|
|
3070
|
+
|
|
3071
|
+
|
|
3072
|
+
border: 1px solid transparent;
|
|
3073
|
+
|
|
3074
|
+
|
|
3075
|
+
}
|
|
3076
|
+
|
|
3077
|
+
|
|
3078
|
+
|
|
3079
|
+
.control-reactive-editor .cr-validation-block i {
|
|
3080
|
+
|
|
3081
|
+
|
|
3082
|
+
margin-right: 6px;
|
|
3083
|
+
|
|
3084
|
+
|
|
3085
|
+
}
|
|
3086
|
+
|
|
3087
|
+
|
|
3088
|
+
|
|
3089
|
+
.control-reactive-editor .cr-validation-block.cr-error {
|
|
3090
|
+
|
|
3091
|
+
|
|
3092
|
+
color: var(--cr-invalid);
|
|
3093
|
+
|
|
3094
|
+
|
|
3095
|
+
background: #fdf2f2;
|
|
3096
|
+
|
|
3097
|
+
|
|
3098
|
+
border-color: #f3c2c2;
|
|
3099
|
+
|
|
3100
|
+
|
|
3101
|
+
}
|
|
3102
|
+
|
|
3103
|
+
|
|
3104
|
+
|
|
3105
|
+
.control-reactive-editor .cr-validation-block.cr-warning {
|
|
3106
|
+
|
|
3107
|
+
|
|
3108
|
+
color: var(--cr-warn);
|
|
3109
|
+
|
|
3110
|
+
|
|
3111
|
+
background: #fff8eb;
|
|
3112
|
+
|
|
3113
|
+
|
|
3114
|
+
border-color: #f6d89b;
|
|
3115
|
+
|
|
3116
|
+
|
|
3117
|
+
}
|
|
3118
|
+
|
|
3119
|
+
|
|
3120
|
+
|
|
3121
|
+
@media (max-width: 1100px) {
|
|
3122
|
+
|
|
3123
|
+
|
|
3124
|
+
.control-reactive-editor .pr-grid-2 {
|
|
3125
|
+
|
|
3126
|
+
|
|
3127
|
+
grid-template-columns: 1fr;
|
|
3128
|
+
|
|
3129
|
+
|
|
3130
|
+
}
|
|
3131
|
+
|
|
3132
|
+
|
|
3133
|
+
}
|
|
3134
|
+
|
|
3135
|
+
|
|
3136
|
+
</style>
|