node-opcua-address-space-for-conformance-testing 2.97.0 → 2.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,1287 +0,0 @@
1
- "use strict";
2
- // tslint:disable: no-console
3
- // tslint:disable: object-literal-sort-keys
4
- // tslint:disable: no-shadowed-variable
5
- /**
6
- * @module opcua.server.simulation
7
- * @class Simulator
8
- *
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.build_address_space_for_conformance_testing = void 0;
12
- const path = require("path");
13
- const fs = require("fs");
14
- const node_opcua_assert_1 = require("node-opcua-assert");
15
- const node_opcua_nodeid_1 = require("node-opcua-nodeid");
16
- const node_opcua_status_code_1 = require("node-opcua-status-code");
17
- const node_opcua_data_model_1 = require("node-opcua-data-model");
18
- const node_opcua_variant_1 = require("node-opcua-variant");
19
- const node_opcua_factory_1 = require("node-opcua-factory");
20
- const node_opcua_data_value_1 = require("node-opcua-data-value");
21
- const ec = require("node-opcua-basic-types");
22
- const node_opcua_data_model_2 = require("node-opcua-data-model");
23
- const node_opcua_data_access_1 = require("node-opcua-data-access");
24
- const testHelpers_1 = require("node-opcua-address-space/testHelpers");
25
- function defaultValidator( /*value*/) {
26
- return true;
27
- }
28
- function getValidatorFuncForType(dataType) {
29
- const f = ec["isValid" + dataType];
30
- return f || defaultValidator;
31
- }
32
- function getRandomFuncForType(dataType) {
33
- const dataTypeName = node_opcua_variant_1.DataType[dataType];
34
- const f = ec["random" + dataTypeName];
35
- if (f) {
36
- return f;
37
- }
38
- switch (dataTypeName) {
39
- case "Variant":
40
- return () => {
41
- return new node_opcua_variant_1.Variant();
42
- };
43
- case "QualifiedName":
44
- return () => {
45
- return new node_opcua_data_model_2.QualifiedName({ name: ec.randomString() });
46
- };
47
- case "LocalizedText":
48
- return () => {
49
- return new node_opcua_data_model_2.LocalizedText({ text: ec.randomString() });
50
- };
51
- case "XmlElement":
52
- return () => {
53
- const element = ec.randomString();
54
- const content = ec.randomString();
55
- return "<" + element + ">" + content + "</" + element + ">";
56
- };
57
- default:
58
- // istanbul ignore next
59
- throw new Error("Cannot find random" + dataTypeName + "() func anywhere");
60
- }
61
- }
62
- function _findDataType(dataTypeName) {
63
- const builtInDataTypeName = (0, node_opcua_factory_1.findBuiltInType)(dataTypeName);
64
- const dataType = node_opcua_variant_1.DataType[builtInDataTypeName.name];
65
- // istanbul ignore next
66
- if (!dataType) {
67
- throw new Error(" dataType " + dataTypeName + " must exists");
68
- }
69
- return dataType;
70
- }
71
- function validate_value_or_array(isArray, variantValue, validatorFunc) {
72
- (0, node_opcua_assert_1.assert)(typeof validatorFunc === "function");
73
- let i;
74
- let value;
75
- if (isArray) {
76
- const n = Math.min(10, variantValue.length);
77
- for (i = 0; i < n; i++) {
78
- value = variantValue[i];
79
- // istanbul ignore next
80
- if (!validatorFunc(value)) {
81
- throw new Error("default value must be valid for dataType " + variantValue + " at index " + i + " got " + value);
82
- }
83
- }
84
- }
85
- else {
86
- // scalar
87
- // istanbul ignore next
88
- if (!validatorFunc(variantValue)) {
89
- throw new Error("default value must be valid for dataType " + variantValue);
90
- }
91
- }
92
- }
93
- function makeVariant(dataTypeName, arrayType, dimensions, current_value) {
94
- const dataType = _findDataType(dataTypeName);
95
- const validatorFunc = getValidatorFuncForType(dataType);
96
- const isArray = arrayType === node_opcua_variant_1.VariantArrayType.Array || arrayType === node_opcua_variant_1.VariantArrayType.Matrix;
97
- validate_value_or_array(isArray, current_value, validatorFunc);
98
- const variant = new node_opcua_variant_1.Variant({
99
- dataType,
100
- arrayType,
101
- dimensions,
102
- value: current_value
103
- });
104
- return variant;
105
- }
106
- // eslint-disable-next-line max-params
107
- function _add_variable(namespace, parent, varName, dataTypeName, current_value, valueRank, arrayDimensions, extra_name) {
108
- const addressSpace = namespace.addressSpace;
109
- (0, node_opcua_assert_1.assert)(typeof extra_name === "string");
110
- const arrayType = valueRank <= 0 ? node_opcua_variant_1.VariantArrayType.Scalar : valueRank === 1 ? node_opcua_variant_1.VariantArrayType.Array : node_opcua_variant_1.VariantArrayType.Matrix;
111
- const variant = makeVariant(dataTypeName, arrayType, arrayDimensions, current_value);
112
- const name = varName + extra_name;
113
- const nodeId = parent.nodeId.toString() + "_" + varName + extra_name;
114
- const placeholder = {
115
- variant
116
- };
117
- const variable = namespace.addVariable({
118
- browseName: name,
119
- componentOf: parent,
120
- dataType: varName,
121
- description: { locale: "en", text: name },
122
- nodeId,
123
- valueRank,
124
- arrayDimensions,
125
- accessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead | CurrentWrite"),
126
- userAccessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead | CurrentWrite"),
127
- value: variant
128
- });
129
- variable._backdoor_placeholder = placeholder;
130
- return variable;
131
- }
132
- function add_scalar_variable(namespace, parent, name, realType, default_value, extra_name) {
133
- (0, node_opcua_assert_1.assert)(typeof extra_name === "string");
134
- const initialValue = typeof default_value === "function" ? default_value() : default_value;
135
- const variable = _add_variable(namespace, parent, name, realType, initialValue, -1, null, extra_name);
136
- (0, node_opcua_assert_1.assert)(variable.valueRank === -1);
137
- // tslint:disable-next-line: no-bitwise
138
- (0, node_opcua_assert_1.assert)(variable.accessLevel === node_opcua_data_model_1.AccessLevelFlag.CurrentRead + node_opcua_data_model_1.AccessLevelFlag.CurrentWrite);
139
- // tslint:disable-next-line: no-bitwise
140
- (0, node_opcua_assert_1.assert)(variable.userAccessLevel === node_opcua_data_model_1.AccessLevelFlag.CurrentRead + node_opcua_data_model_1.AccessLevelFlag.CurrentWrite);
141
- (0, node_opcua_assert_1.assert)(variable.historizing === false);
142
- return variable;
143
- }
144
- function add_array_variable(namespace, parent, dataTypeName, default_value, realTypeName, arrayLength, extra_name) {
145
- (0, node_opcua_assert_1.assert)(typeof dataTypeName === "string");
146
- (0, node_opcua_assert_1.assert)(typeof realTypeName === "string");
147
- // istanbul ignore next
148
- if (!node_opcua_variant_1.DataType[realTypeName]) {
149
- console.log("dataTypeName", dataTypeName);
150
- console.log("realTypeName", realTypeName);
151
- }
152
- (0, node_opcua_assert_1.assert)(node_opcua_variant_1.DataType[realTypeName], " expecting a valid real type");
153
- arrayLength = arrayLength || 10;
154
- const local_defaultValue = typeof default_value === "function" ? default_value() : default_value;
155
- const current_value = (0, node_opcua_variant_1.buildVariantArray)(node_opcua_variant_1.DataType[realTypeName], arrayLength, local_defaultValue);
156
- const variable = _add_variable(namespace, parent, dataTypeName, realTypeName, current_value, 1, null, extra_name);
157
- (0, node_opcua_assert_1.assert)(variable.valueRank === 1);
158
- (0, node_opcua_assert_1.assert)(variable.accessLevel === node_opcua_data_model_1.AccessLevelFlag.CurrentRead + node_opcua_data_model_1.AccessLevelFlag.CurrentWrite);
159
- (0, node_opcua_assert_1.assert)(variable.userAccessLevel === node_opcua_data_model_1.AccessLevelFlag.CurrentRead + node_opcua_data_model_1.AccessLevelFlag.CurrentWrite);
160
- (0, node_opcua_assert_1.assert)(variable.historizing === false);
161
- }
162
- function add_multi_dimensional_array_variable(namespace, parent, dataTypeName, default_value, realTypeName, arrayLength, extra_name) {
163
- (0, node_opcua_assert_1.assert)(typeof dataTypeName === "string");
164
- (0, node_opcua_assert_1.assert)(typeof realTypeName === "string");
165
- // istanbul ignore next
166
- if (!node_opcua_variant_1.DataType[realTypeName]) {
167
- console.log("dataTypeName", dataTypeName);
168
- console.log("realTypeName", realTypeName);
169
- }
170
- (0, node_opcua_assert_1.assert)(node_opcua_variant_1.DataType[realTypeName], " expecting a valid real type");
171
- arrayLength = arrayLength || 10;
172
- const local_defaultValue = typeof default_value === "function" ? default_value() : default_value;
173
- const current_value = (0, node_opcua_variant_1.buildVariantArray)(node_opcua_variant_1.DataType[realTypeName], arrayLength * arrayLength, local_defaultValue);
174
- const variable = _add_variable(namespace, parent, dataTypeName, realTypeName, current_value, 2, [arrayLength, arrayLength], extra_name);
175
- (0, node_opcua_assert_1.assert)(variable.valueRank === 2);
176
- (0, node_opcua_assert_1.assert)(variable.accessLevel === node_opcua_data_model_1.AccessLevelFlag.CurrentRead + node_opcua_data_model_1.AccessLevelFlag.CurrentWrite);
177
- (0, node_opcua_assert_1.assert)(variable.userAccessLevel === node_opcua_data_model_1.AccessLevelFlag.CurrentRead + node_opcua_data_model_1.AccessLevelFlag.CurrentWrite);
178
- (0, node_opcua_assert_1.assert)(variable.historizing === false);
179
- }
180
- function add_mass_variables_of_type(namespace, parent, dataTypeName, default_value, realType) {
181
- // Mass Mass_Boolean -> Mass_Boolean_Boolean_00 ...
182
- const nodeName = "Scalar_Mass_" + dataTypeName;
183
- // xx console.log("xxxx adding mass variable ", nodeName);
184
- const scalarMass_Type = namespace.addObject({
185
- browseName: nodeName,
186
- description: "This folder will contain 100 items per supported data-type.",
187
- nodeId: "s=" + nodeName,
188
- organizedBy: parent
189
- });
190
- for (let i = 0; i <= 99; i++) {
191
- const extra_name = "_" + i.toString().padStart(2, "0");
192
- const local_defaultValue = typeof default_value === "function" ? default_value() : default_value;
193
- _add_variable(namespace, scalarMass_Type, dataTypeName, realType, local_defaultValue, -1, null, extra_name);
194
- }
195
- }
196
- function add_mass_variables(namespace, scalarFolder) {
197
- const scalarMass = namespace.addFolder(scalarFolder, {
198
- browseName: "Scalar_Mass",
199
- description: "This folder will contain 100 items per supported data-type.",
200
- nodeId: "s=Scalar_Mass"
201
- });
202
- typeAndDefaultValue.forEach((e) => {
203
- const dataType = e.type;
204
- const realType = e.realType || dataType;
205
- add_mass_variables_of_type(namespace, scalarMass, dataType, e.defaultValue, realType);
206
- });
207
- }
208
- const DateTime_Min = new Date();
209
- const typeAndDefaultValue = [
210
- { type: "Boolean", defaultValue: false },
211
- { type: "ByteString", defaultValue: Buffer.from("OPCUA") },
212
- { type: "DateTime", defaultValue: DateTime_Min },
213
- { type: "Double", defaultValue: 0.0 },
214
- { type: "Float", defaultValue: 0.0 },
215
- { type: "Guid", defaultValue: ec.emptyGuid },
216
- { type: "SByte", defaultValue: 0 },
217
- { type: "Int16", defaultValue: 0 },
218
- { type: "Int32", defaultValue: 0 },
219
- {
220
- type: "NodeId",
221
- defaultValue() {
222
- return (0, node_opcua_nodeid_1.coerceNodeId)("ns=" + 3 + ";g=00000000-0000-0000-0000-000000000023");
223
- }
224
- },
225
- { type: "String", defaultValue: "OPCUA" },
226
- { type: "Byte", defaultValue: 0 },
227
- { type: "UInt16", defaultValue: 0 },
228
- { type: "UInt32", defaultValue: 0 },
229
- { type: "Duration", realType: "Double", defaultValue: 0.0 },
230
- { type: "Number", realType: "UInt16", defaultValue: 0 },
231
- { type: "Integer", realType: "Int64", defaultValue: 0 },
232
- { type: "UInteger", realType: "UInt64", defaultValue: 0 },
233
- {
234
- type: "UtcTime",
235
- realType: "DateTime",
236
- defaultValue() {
237
- return new Date();
238
- }
239
- },
240
- // xx { type: "Int64", defaultValue: 0},
241
- { type: "LocaleId", realType: "String", defaultValue: "" },
242
- {
243
- type: "LocalizedText",
244
- defaultValue() {
245
- return new node_opcua_data_model_2.LocalizedText({});
246
- }
247
- },
248
- {
249
- type: "QualifiedName",
250
- defaultValue() {
251
- return new node_opcua_data_model_2.QualifiedName();
252
- }
253
- },
254
- { type: "UInt64", defaultValue: [0, 0] },
255
- { type: "Int64", defaultValue: [0, 0] },
256
- // xx {type: "Variant", realType: "Variant", defaultValue: {} },
257
- { type: "XmlElement", defaultValue: "<string1>OPCUA</string1>" },
258
- { type: "ImageBMP", realType: "ByteString", defaultValue: null },
259
- { type: "ImageGIF", realType: "ByteString", defaultValue: null },
260
- { type: "ImageJPG", realType: "ByteString", defaultValue: null },
261
- { type: "ImagePNG", realType: "ByteString", defaultValue: null }
262
- // {type: "Enumeration", realType: "UInt32" , defaultValue:0}
263
- ];
264
- function add_simulation_variables(namespace, scalarFolder) {
265
- let values_to_change = [];
266
- function add_simulation_variable(parent, dataTypeName, defaultValue, realTypeName) {
267
- // the type of the default value
268
- realTypeName = realTypeName || dataTypeName;
269
- const dataType = _findDataType(realTypeName);
270
- const randomFunc = getRandomFuncForType(dataType);
271
- // istanbul ignore next
272
- if (typeof randomFunc !== "function") {
273
- throw new Error("a random function must exist for basicType " + dataTypeName);
274
- }
275
- const variable = _add_variable(namespace, parent, dataTypeName, realTypeName, defaultValue, -1, null, "");
276
- const value_to_change = {
277
- dataType,
278
- randomFunc,
279
- variable
280
- };
281
- values_to_change.push(value_to_change);
282
- return variable;
283
- }
284
- const simulation = namespace.addObject({
285
- browseName: "Scalar_Simulation",
286
- description: "This folder will contain one item per supported data-type.",
287
- nodeId: "s=Scalar_Simulation",
288
- organizedBy: scalarFolder
289
- });
290
- // add simulation variables
291
- typeAndDefaultValue.forEach((e) => {
292
- const dataType = e.type;
293
- const defaultValue = typeof e.defaultValue === "function" ? e.defaultValue() : e.defaultValue;
294
- const realType = e.realType || dataType;
295
- add_simulation_variable(simulation, dataType, defaultValue, realType);
296
- });
297
- // add management nodes
298
- let interval = 2000;
299
- let enabled = true;
300
- let timer;
301
- function change_randomly() {
302
- values_to_change.forEach((element) => {
303
- const variant = element.variable._backdoor_placeholder.variant;
304
- variant.value = element.randomFunc();
305
- element.variable.setValueFromSource(variant);
306
- });
307
- }
308
- function delete_Timer() {
309
- // delete previous timer if any
310
- if (timer) {
311
- clearInterval(timer);
312
- timer = undefined;
313
- }
314
- }
315
- function install_Timer() {
316
- delete_Timer();
317
- (0, node_opcua_assert_1.assert)(!timer);
318
- if (enabled) {
319
- timer = setInterval(() => {
320
- change_randomly();
321
- }, interval);
322
- }
323
- }
324
- function tearDown_Timer() {
325
- delete_Timer();
326
- values_to_change = [];
327
- }
328
- const intervalVariable = namespace.addVariable({
329
- browseName: "Interval",
330
- componentOf: simulation,
331
- dataType: "UInt16",
332
- description: { locale: "en", text: "The rate (in msec) of change for all Simulated items." },
333
- nodeId: "s=Scalar_Simulation_Interval",
334
- value: new node_opcua_variant_1.Variant({
335
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
336
- dataType: node_opcua_variant_1.DataType.UInt16,
337
- value: interval
338
- })
339
- });
340
- intervalVariable.on("value_changed", (dataValue /*,indexRange*/) => {
341
- const variant = dataValue.value;
342
- (0, node_opcua_assert_1.assert)(variant instanceof node_opcua_variant_1.Variant);
343
- (0, node_opcua_assert_1.assert)(ec.isValidUInt16(variant.value), " value must be valid for dataType");
344
- interval = variant.value;
345
- install_Timer();
346
- });
347
- const enabledVariable = namespace.addVariable({
348
- componentOf: simulation,
349
- browseName: "Enabled",
350
- description: { locale: "en", text: "Enabled" },
351
- nodeId: "s=Scalar_Simulation_Enabled",
352
- dataType: "Boolean",
353
- value: new node_opcua_variant_1.Variant({
354
- dataType: node_opcua_variant_1.DataType.Boolean,
355
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
356
- value: enabled
357
- })
358
- });
359
- enabledVariable.on("value_changed", (dataValue /*,indexRange*/) => {
360
- const variant = dataValue.value;
361
- (0, node_opcua_assert_1.assert)(variant instanceof node_opcua_variant_1.Variant);
362
- (0, node_opcua_assert_1.assert)(ec.isValidBoolean(variant.value), " value must be valid for dataType");
363
- enabled = variant.value;
364
- install_Timer();
365
- });
366
- install_Timer();
367
- const addressSpace = namespace.addressSpace;
368
- addressSpace.registerShutdownTask(tearDown_Timer);
369
- }
370
- function add_static_variables(namespace, scalarFolder) {
371
- const staticScalarFolder = namespace.addObject({
372
- organizedBy: scalarFolder,
373
- browseName: "Scalars",
374
- description: "This folder will contain one item per supported data-type.",
375
- nodeId: "s=Static_Scalar"
376
- });
377
- // add statics scalar Variables
378
- typeAndDefaultValue.forEach((e) => {
379
- const dataType = e.type;
380
- const realType = e.realType || dataType;
381
- const defaultValue = typeof e.defaultValue === "function" ? e.defaultValue() : e.defaultValue;
382
- add_scalar_variable(namespace, staticScalarFolder, dataType, realType, defaultValue, "");
383
- });
384
- function setImage2(imageType, filename) {
385
- const fullPath = path.join(__dirname, "../data", filename);
386
- const imageNode = namespace.findNode("s=Static_Scalar_Image" + imageType);
387
- const options = {
388
- refreshFunc: (callback) => {
389
- fs.readFile(fullPath, (err, data) => {
390
- if (err) {
391
- return callback(null, new node_opcua_data_value_1.DataValue({
392
- statusCode: node_opcua_status_code_1.StatusCodes.BadInternalError,
393
- value: { dataType: "ByteString", value: null }
394
- }));
395
- }
396
- (0, node_opcua_assert_1.assert)(data instanceof Buffer);
397
- callback(null, new node_opcua_data_value_1.DataValue({ value: { dataType: "ByteString", value: data } }));
398
- });
399
- }
400
- };
401
- imageNode.bindVariable(options, /*overwrite=*/ true);
402
- }
403
- function setImage(imageType, filename) {
404
- const fullPath = path.join(__dirname, "../data", filename);
405
- const imageNode = namespace.findNode("s=Static_Scalar_Image" + imageType);
406
- fs.readFile(fullPath, (err, data) => {
407
- if (!err) {
408
- (0, node_opcua_assert_1.assert)(data instanceof Buffer);
409
- imageNode.setValueFromSource(new node_opcua_variant_1.Variant({ dataType: node_opcua_variant_1.DataType.ByteString, value: data }));
410
- }
411
- else {
412
- console.log("cannot load file =", fullPath);
413
- }
414
- });
415
- }
416
- setImage("BMP", "image.bmp");
417
- setImage("PNG", "tux.png");
418
- setImage("GIF", "gif-anime.gif");
419
- setImage("JPG", "tiger.jpg");
420
- // add static Array Variables
421
- const staticArraysFolders = namespace.addObject({
422
- organizedBy: scalarFolder,
423
- browseName: "Arrays",
424
- description: "Single dimension, suggested size of 10-elements per array. Unsupported types will be missing from the address-space.",
425
- nodeId: "s=Static_Array"
426
- });
427
- // add static Array
428
- typeAndDefaultValue.forEach((e) => {
429
- const dataType = e.type;
430
- const realType = e.realType || dataType;
431
- add_array_variable(namespace, staticArraysFolders, dataType, e.defaultValue, realType, 10, "");
432
- });
433
- // add static MultiDimension Array Variables
434
- const staticMultiDimensionalArrays = namespace.addObject({
435
- organizedBy: scalarFolder,
436
- browseName: "Multi-Dimensional Arrays",
437
- description: "Single dimension, suggested size of 10-elements per array. Unsupported types will be missing from the address-space.",
438
- nodeId: "s=Static_MultiDimensional_Array"
439
- });
440
- // add static Array
441
- typeAndDefaultValue.forEach((e) => {
442
- const dataType = e.type;
443
- const realType = e.realType || dataType;
444
- add_multi_dimensional_array_variable(namespace, staticMultiDimensionalArrays, dataType, e.defaultValue, realType, 10, "");
445
- });
446
- }
447
- function add_access_right_variables(namespace, parentFolder) {
448
- const accessRight_Folder = namespace.addFolder(parentFolder, {
449
- browseName: "AccessRight",
450
- description: "Folder containing various nodes with different access right behavior",
451
- nodeId: "s=AccessRight"
452
- });
453
- const accessLevel_All_Folder = namespace.addFolder(accessRight_Folder, {
454
- browseName: "AccessLevel",
455
- description: "Various node with different access right behavior",
456
- nodeId: "s=AccessLevel"
457
- });
458
- let name = "AccessLevel_CurrentRead";
459
- namespace.addVariable({
460
- componentOf: accessLevel_All_Folder,
461
- browseName: name,
462
- description: { locale: "en", text: name },
463
- nodeId: "s=" + name,
464
- dataType: "Int32",
465
- valueRank: -1,
466
- accessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead"),
467
- userAccessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead"),
468
- value: new node_opcua_variant_1.Variant({
469
- dataType: node_opcua_variant_1.DataType.Int32,
470
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
471
- value: 36
472
- })
473
- });
474
- name = "AccessLevel_CurrentWrite";
475
- namespace.addVariable({
476
- componentOf: accessLevel_All_Folder,
477
- browseName: name,
478
- description: { locale: "en", text: name },
479
- nodeId: "s=" + name,
480
- dataType: "Int32",
481
- valueRank: -1,
482
- accessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentWrite"),
483
- userAccessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentWrite"),
484
- value: {}
485
- });
486
- name = "AccessLevel_CurrentRead_NotUser";
487
- namespace.addVariable({
488
- componentOf: accessLevel_All_Folder,
489
- browseName: name,
490
- description: { locale: "en", text: name },
491
- nodeId: "s=" + name,
492
- dataType: "Int32",
493
- valueRank: -1,
494
- accessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead"),
495
- userAccessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)(""),
496
- value: new node_opcua_variant_1.Variant({
497
- dataType: node_opcua_variant_1.DataType.Int32,
498
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
499
- value: 36
500
- })
501
- });
502
- name = "AccessLevel_CurrentWrite_NotUser";
503
- namespace.addVariable({
504
- componentOf: accessLevel_All_Folder,
505
- browseName: name,
506
- description: { locale: "en", text: name },
507
- nodeId: "s=" + name,
508
- dataType: "Int32",
509
- valueRank: -1,
510
- accessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentWrite | CurrentRead"),
511
- userAccessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead"),
512
- value: new node_opcua_variant_1.Variant({
513
- dataType: node_opcua_variant_1.DataType.Int32,
514
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
515
- value: 36
516
- })
517
- });
518
- name = "AccessLevel_CurrentRead_NotCurrentWrite";
519
- namespace.addVariable({
520
- componentOf: accessLevel_All_Folder,
521
- browseName: name,
522
- description: { locale: "en", text: name },
523
- nodeId: "s=" + name,
524
- dataType: "Int32",
525
- valueRank: -1,
526
- accessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead"),
527
- userAccessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead"),
528
- value: new node_opcua_variant_1.Variant({
529
- dataType: node_opcua_variant_1.DataType.Int32,
530
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
531
- value: 36
532
- })
533
- });
534
- name = "AccessLevel_CurrentWrite_NotCurrentRead";
535
- namespace.addVariable({
536
- componentOf: accessLevel_All_Folder,
537
- browseName: name,
538
- description: { locale: "en", text: name },
539
- nodeId: "s=" + name,
540
- dataType: "Int32",
541
- valueRank: -1,
542
- accessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentWrite"),
543
- userAccessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentWrite"),
544
- value: new node_opcua_variant_1.Variant({
545
- dataType: node_opcua_variant_1.DataType.Int32,
546
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
547
- value: 36
548
- })
549
- });
550
- name = "AccessLevel_DeniedAll";
551
- namespace.addVariable({
552
- componentOf: accessLevel_All_Folder,
553
- browseName: name,
554
- description: { locale: "en", text: name },
555
- nodeId: "s=" + name,
556
- dataType: "Int32",
557
- valueRank: -1,
558
- accessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)(""),
559
- userAccessLevel: (0, node_opcua_data_model_1.makeAccessLevelFlag)(""),
560
- value: new node_opcua_variant_1.Variant({
561
- dataType: node_opcua_variant_1.DataType.Int32,
562
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
563
- value: 36
564
- })
565
- });
566
- }
567
- function add_node_with_references(namespace, simulation_folder) {
568
- const parent = simulation_folder;
569
- const referenceFolder = namespace.addObject({
570
- browseName: "References",
571
- nodeId: "s=Demo.CTT.References",
572
- organizedBy: parent,
573
- typeDefinition: "FolderType"
574
- });
575
- (() => {
576
- const has3ForwardReferences1 = namespace.addObject({
577
- browseName: "Has3ForwardReferences1",
578
- nodeId: "s=Demo.CTT.References.Has3ForwardReferences1",
579
- componentOf: referenceFolder,
580
- typeDefinition: "FolderType"
581
- });
582
- const referenceNode1 = namespace.addVariable({
583
- browseName: "ReferenceNode1",
584
- componentOf: has3ForwardReferences1,
585
- dataType: "UInt32"
586
- });
587
- const referenceNode2 = namespace.addVariable({
588
- browseName: "ReferenceNode2",
589
- componentOf: has3ForwardReferences1,
590
- dataType: "UInt32"
591
- });
592
- const referenceNode3 = namespace.addVariable({
593
- browseName: "ReferenceNode3",
594
- componentOf: has3ForwardReferences1,
595
- dataType: "UInt32"
596
- });
597
- })();
598
- (() => {
599
- const has3ForwardReferences2 = namespace.addObject({
600
- browseName: "Has3ForwardReferences2",
601
- nodeId: "s=Demo.CTT.References.Has3ForwardReferences2",
602
- componentOf: referenceFolder,
603
- typeDefinition: "FolderType"
604
- });
605
- const baseDataVariable = namespace.addVariable({
606
- browseName: "BaseDataVariable",
607
- componentOf: has3ForwardReferences2,
608
- dataType: "UInt32"
609
- });
610
- const method1 = namespace.addMethod(has3ForwardReferences2, {
611
- browseName: "Method1"
612
- });
613
- const method2 = namespace.addMethod(has3ForwardReferences2, {
614
- browseName: "Method2"
615
- });
616
- const method3 = namespace.addMethod(has3ForwardReferences2, {
617
- browseName: "Method3"
618
- });
619
- const property = namespace.addVariable({
620
- browseName: "Property",
621
- propertyOf: has3ForwardReferences2,
622
- dataType: "UInt32"
623
- });
624
- })();
625
- (() => {
626
- const has3ForwardReferences3 = namespace.addObject({
627
- browseName: "Has3ForwardReferences3",
628
- nodeId: "s=Demo.CTT.References.Has3ForwardReferences3",
629
- componentOf: referenceFolder,
630
- typeDefinition: "FolderType"
631
- });
632
- const referencedNode1 = namespace.addFolder(has3ForwardReferences3, "ReferencedNode1");
633
- const referencedNode2 = namespace.addFolder(has3ForwardReferences3, "ReferencedNode2");
634
- const referencedNode3 = namespace.addFolder(has3ForwardReferences3, "ReferencedNode3");
635
- const has3InverseReferences = namespace.addObject({
636
- browseName: "Has3InverseReferences",
637
- nodeId: "s=Demo.CTT.References.Has3InverseReferences",
638
- componentOf: referenceFolder,
639
- typeDefinition: "FolderType"
640
- });
641
- referencedNode1.addReference({
642
- referenceType: "Organizes",
643
- nodeId: has3InverseReferences
644
- });
645
- referencedNode2.addReference({
646
- referenceType: "Organizes",
647
- nodeId: has3InverseReferences
648
- });
649
- referencedNode3.addReference({
650
- referenceType: "Organizes",
651
- nodeId: has3InverseReferences
652
- });
653
- })();
654
- (() => {
655
- const has3ForwardReferences4 = namespace.addObject({
656
- browseName: "Has3ForwardReferences4",
657
- nodeId: "s=Demo.CTT.References.Has3ForwardReferences4",
658
- componentOf: referenceFolder,
659
- typeDefinition: "FolderType"
660
- });
661
- const prop1 = namespace.addVariable({
662
- browseName: "ReferenceNode1",
663
- propertyOf: has3ForwardReferences4,
664
- dataType: "UInt32"
665
- });
666
- const prop2 = namespace.addVariable({
667
- browseName: "ReferenceNode2",
668
- propertyOf: has3ForwardReferences4,
669
- dataType: "UInt32"
670
- });
671
- const prop3 = namespace.addVariable({
672
- browseName: "ReferenceNode3",
673
- propertyOf: has3ForwardReferences4,
674
- dataType: "UInt32"
675
- });
676
- })();
677
- (() => {
678
- const has3ForwardReferences5 = namespace.addObject({
679
- browseName: "Has3ForwardReferences5",
680
- nodeId: "s=Demo.CTT.References.Has3ForwardReferences5",
681
- componentOf: referenceFolder,
682
- typeDefinition: "FolderType"
683
- });
684
- namespace.addFolder(has3ForwardReferences5, {
685
- browseName: "ReferenceNode1"
686
- });
687
- namespace.addVariable({
688
- browseName: "ReferenceNode2",
689
- propertyOf: has3ForwardReferences5,
690
- dataType: "UInt32"
691
- });
692
- const method3 = namespace.addMethod(has3ForwardReferences5, {
693
- browseName: "ReferenceNode3"
694
- });
695
- })();
696
- (() => {
697
- const hasInverseAndForwardReferences = namespace.addObject({
698
- browseName: "HasInverseAndForwardReferences",
699
- nodeId: "s=Demo.CTT.References.HasInverseAndForwardReferences",
700
- componentOf: referenceFolder,
701
- typeDefinition: "FolderType"
702
- });
703
- const nodeId = namespace.addFolder(hasInverseAndForwardReferences, {
704
- browseName: "ReferenceNode1"
705
- });
706
- hasInverseAndForwardReferences.addReference({
707
- nodeId,
708
- referenceType: "AlarmGroupMember"
709
- });
710
- })();
711
- const hasReferencesWithDifferentParentTypes = namespace.addObject({
712
- browseName: "HasReferencesWithDifferentParentTypes",
713
- nodeId: "s=Demo.CTT.References.HasReferencesWithDifferentParentTypes",
714
- componentOf: referenceFolder,
715
- typeDefinition: "FolderType"
716
- });
717
- (() => {
718
- const hasReferencesOfAReferenceTypeAndSubType = namespace.addObject({
719
- browseName: "HasReferencesOfAReferenceTypeAndSubType",
720
- nodeId: "s=Demo.CTT.References.HasReferencesOfAReferenceTypeAndSubType",
721
- typeDefinition: "FolderType",
722
- componentOf: referenceFolder
723
- });
724
- namespace.addVariable({
725
- browseName: "ReferenceNode1",
726
- propertyOf: hasReferencesOfAReferenceTypeAndSubType,
727
- dataType: "UInt32"
728
- });
729
- namespace.addVariable({
730
- browseName: "ReferenceNode2",
731
- propertyOf: hasReferencesOfAReferenceTypeAndSubType,
732
- dataType: "UInt32"
733
- });
734
- namespace.addVariable({
735
- browseName: "ReferenceNode3",
736
- propertyOf: hasReferencesOfAReferenceTypeAndSubType,
737
- dataType: "UInt32"
738
- });
739
- namespace.addVariable({
740
- browseName: "ReferenceNode4",
741
- propertyOf: hasReferencesOfAReferenceTypeAndSubType,
742
- dataType: "UInt32"
743
- });
744
- for (let i = 0; i < 4; i++) {
745
- const a = namespace.addObject({
746
- browseName: "AlarmSuppressionGroup" + i,
747
- componentOf: referenceFolder
748
- });
749
- hasReferencesOfAReferenceTypeAndSubType.addReference({
750
- nodeId: a,
751
- referenceType: "HasAlarmSuppressionGroup"
752
- });
753
- }
754
- })();
755
- }
756
- function add_path_10deep(namespace, simulation_folder) {
757
- let parent = simulation_folder;
758
- for (let i = 1; i <= 10; i++) {
759
- const name = "Path_" + i.toString() + "Deep";
760
- const child = namespace.addObject({
761
- organizedBy: parent,
762
- browseName: name,
763
- description: "A folder at the top of " + i + " elements",
764
- typeDefinition: "FolderType",
765
- nodeId: "s=" + name
766
- });
767
- parent = child;
768
- }
769
- }
770
- function add_very_large_array_variables(namespace, objectsFolder) {
771
- // add statics Array Variables
772
- const scalarStaticLargeArray = namespace.addObject({
773
- organizedBy: objectsFolder,
774
- browseName: "Static_Scalar_Large_Array",
775
- description: "Single dimension, suggested size of 100k-elements per array.",
776
- nodeId: "s=Static_Scalar_Large_Array"
777
- });
778
- typeAndDefaultValue.forEach((e) => {
779
- const dataType = e.type;
780
- const realType = e.realType || dataType;
781
- add_array_variable(namespace, scalarStaticLargeArray, dataType, e.defaultValue, realType, 50 * 1024, "");
782
- });
783
- }
784
- // BaseDataVariableType
785
- // |
786
- // DataItemType
787
- // ^
788
- // |
789
- // +----------------+---------------------+
790
- // | | |
791
- // ArrayItemType AnalogItemType DiscreteItemType
792
- // ^
793
- // |
794
- // +-----------------------------+---------------------------------+
795
- // | | |
796
- // TwoStateDiscreteType MultiStateDiscreteType MultiStateValueDiscreteType
797
- //
798
- function add_analog_data_items(namespace, parentFolder) {
799
- function _addDataItem(localParentFolder, dataType, initialValue) {
800
- const name = node_opcua_variant_1.DataType[dataType] + "DataItem";
801
- const nodeId = "s=" + name;
802
- const v = namespace.addDataItem({
803
- componentOf: localParentFolder,
804
- nodeId,
805
- browseName: name,
806
- definition: "(tempA -25) + tempB",
807
- dataType,
808
- value: {
809
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
810
- dataType,
811
- value: initialValue
812
- }
813
- });
814
- (0, node_opcua_assert_1.assert)(v.nodeId.toString() === `ns=${namespace.index};${nodeId}`, `ns=${namespace.index};${nodeId}` + " " + v.nodeId.toString());
815
- }
816
- function makeRange(dataType) {
817
- let engineeringUnitsRange = { low: -200, high: 200 };
818
- let instrumentRange = { low: -200, high: 200 };
819
- if (node_opcua_variant_1.DataType[dataType][0] === "U" || dataType === node_opcua_variant_1.DataType.Byte) {
820
- engineeringUnitsRange = { low: 10, high: 250 };
821
- instrumentRange = { low: 10, high: 250 };
822
- }
823
- return { engineeringUnitsRange, instrumentRange };
824
- }
825
- function _addAnalogDataItem(localParentFolder, dataType, initialValue) {
826
- const { engineeringUnitsRange, instrumentRange } = makeRange(dataType);
827
- (0, node_opcua_assert_1.assert)(Array.isArray(initialValue) || (initialValue >= engineeringUnitsRange.low && initialValue <= engineeringUnitsRange.high));
828
- const name = node_opcua_variant_1.DataType[dataType] + "AnalogDataItem";
829
- const nodeId = "s=" + name;
830
- // UAAnalogItem
831
- // add a UAAnalogItem
832
- namespace.addAnalogDataItem({
833
- componentOf: localParentFolder,
834
- nodeId,
835
- browseName: name,
836
- definition: "...",
837
- valuePrecision: 0.5,
838
- engineeringUnitsRange,
839
- instrumentRange,
840
- engineeringUnits: node_opcua_data_access_1.standardUnits.degree_celsius,
841
- dataType,
842
- value: {
843
- arrayType: node_opcua_variant_1.VariantArrayType.Scalar,
844
- dataType,
845
- value: initialValue
846
- }
847
- });
848
- }
849
- function _addArrayAnalogDataItem(localParentFolder, dataType, initialValue) {
850
- const name = node_opcua_variant_1.DataType[dataType] + "ArrayAnalogDataItem";
851
- const nodeId = "s=" + name;
852
- // UAAnalogItem
853
- const { engineeringUnitsRange, instrumentRange } = makeRange(dataType);
854
- // add a UAAnalogItem
855
- namespace.addAnalogDataItem({
856
- componentOf: localParentFolder,
857
- nodeId,
858
- browseName: name,
859
- definition: "(tempA -25) + tempB",
860
- valuePrecision: 0.5,
861
- engineeringUnitsRange,
862
- instrumentRange,
863
- engineeringUnits: node_opcua_data_access_1.standardUnits.degree_celsius,
864
- dataType,
865
- value: {
866
- arrayType: node_opcua_variant_1.VariantArrayType.Array,
867
- dataType,
868
- value: [initialValue, initialValue, initialValue, initialValue, initialValue]
869
- }
870
- });
871
- }
872
- // add statics Array Variables
873
- const analogItemFolder = namespace.addObject({
874
- organizedBy: parentFolder,
875
- browseName: "Simulation_AnalogDataItem",
876
- typeDefinition: "FolderType",
877
- nodeId: "s=Simulation_AnalogDataItem"
878
- });
879
- const name = "DoubleAnalogDataItemWithEU";
880
- const nodeId = "s=" + name;
881
- const { engineeringUnitsRange, instrumentRange } = makeRange(node_opcua_variant_1.DataType.Double);
882
- namespace.addAnalogDataItem({
883
- componentOf: analogItemFolder,
884
- nodeId,
885
- browseName: name,
886
- definition: "(tempA -25) + tempB",
887
- valuePrecision: 0.5,
888
- engineeringUnitsRange,
889
- instrumentRange,
890
- engineeringUnits: node_opcua_data_access_1.standardUnits.degree_celsius,
891
- dataType: node_opcua_variant_1.DataType.Double,
892
- value: {
893
- dataType: node_opcua_variant_1.DataType.Double,
894
- value: 19.5
895
- }
896
- });
897
- const data = [
898
- { dataType: node_opcua_variant_1.DataType.Double, value: 3.14 },
899
- { dataType: node_opcua_variant_1.DataType.Float, value: 3.14 },
900
- { dataType: node_opcua_variant_1.DataType.Int16, value: -10 },
901
- { dataType: node_opcua_variant_1.DataType.UInt16, value: 10 },
902
- { dataType: node_opcua_variant_1.DataType.Int32, value: -100 },
903
- { dataType: node_opcua_variant_1.DataType.UInt32, value: 100 },
904
- { dataType: node_opcua_variant_1.DataType.Int64, value: [0, 0] },
905
- { dataType: node_opcua_variant_1.DataType.UInt64, value: [0, 0] },
906
- { dataType: node_opcua_variant_1.DataType.Byte, value: 65 },
907
- { dataType: node_opcua_variant_1.DataType.SByte, value: -23 }
908
- ];
909
- data.forEach((e) => {
910
- _addAnalogDataItem(analogItemFolder, e.dataType, e.value);
911
- });
912
- data.forEach((e) => {
913
- _addDataItem(analogItemFolder, e.dataType, e.value);
914
- });
915
- _addDataItem(analogItemFolder, node_opcua_variant_1.DataType.String, "some string");
916
- _addDataItem(analogItemFolder, node_opcua_variant_1.DataType.DateTime, new Date());
917
- data.forEach((e) => {
918
- _addArrayAnalogDataItem(analogItemFolder, e.dataType, e.value);
919
- });
920
- }
921
- function getDADiscreteTypeFolder(namespace, parentFolder) {
922
- const name = "Simulation_DA_DiscreteType";
923
- const nodeId = "s=Simulation_DA_DiscreteType";
924
- let node = parentFolder.getFolderElementByName(name);
925
- if (!node) {
926
- node = namespace.addObject({
927
- organizedBy: parentFolder,
928
- typeDefinition: "FolderType",
929
- browseName: name,
930
- nodeId
931
- });
932
- }
933
- return node;
934
- }
935
- function add_two_state_discrete_variables(namespace, parentFolder) {
936
- const DADiscreteTypeFolder = getDADiscreteTypeFolder(namespace, parentFolder);
937
- const twoStateDiscrete001 = namespace.addTwoStateDiscrete({
938
- organizedBy: DADiscreteTypeFolder,
939
- nodeId: "s=TwoStateDiscrete001",
940
- browseName: "TwoStateDiscrete001",
941
- trueState: "Enabled",
942
- falseState: "Disabled"
943
- });
944
- const twoStateDiscrete002 = namespace.addTwoStateDiscrete({
945
- organizedBy: DADiscreteTypeFolder,
946
- nodeId: "s=TwoStateDiscrete002",
947
- browseName: "TwoStateDiscrete002",
948
- trueState: "On",
949
- falseState: "Off",
950
- optionals: ["TransitionTime", "EffectiveDisplayName"]
951
- });
952
- const twoStateDiscrete003 = namespace.addTwoStateDiscrete({
953
- browseName: "twoStateDiscrete003",
954
- nodeId: "s=TwoStateDiscrete003",
955
- optionals: ["TransitionTime"],
956
- isTrueSubStateOf: twoStateDiscrete002
957
- });
958
- const twoStateDiscrete004 = namespace.addTwoStateDiscrete({
959
- organizedBy: DADiscreteTypeFolder,
960
- nodeId: "s=TwoStateDiscrete004",
961
- browseName: "TwoStateDiscrete004",
962
- trueState: "InProgress",
963
- falseState: "Stopped"
964
- });
965
- const twoStateDiscrete005 = namespace.addTwoStateDiscrete({
966
- organizedBy: DADiscreteTypeFolder,
967
- nodeId: "s=TwoStateDiscrete005",
968
- browseName: "TwoStateDiscrete005",
969
- trueState: "InProgress",
970
- falseState: "Stopped"
971
- });
972
- twoStateDiscrete001.setValueFromSource({ dataType: "Boolean", value: false });
973
- twoStateDiscrete002.setValueFromSource({ dataType: "Boolean", value: false });
974
- twoStateDiscrete003.setValueFromSource({ dataType: "Boolean", value: false });
975
- twoStateDiscrete004.setValueFromSource({ dataType: "Boolean", value: false });
976
- twoStateDiscrete005.setValueFromSource({ dataType: "Boolean", value: false });
977
- }
978
- function add_multi_state_discrete_variable(namespace, parentFolder) {
979
- const DADiscreteTypeFolder = getDADiscreteTypeFolder(namespace, parentFolder);
980
- // MultiStateDiscrete001
981
- const multiStateDiscrete001 = namespace.addMultiStateDiscrete({
982
- organizedBy: DADiscreteTypeFolder,
983
- nodeId: "s=MultiStateDiscrete001",
984
- browseName: "MultiStateDiscrete001",
985
- enumStrings: ["Red", "Orange", "Green"],
986
- value: 1 // Orange
987
- });
988
- // MultiStateDiscrete002
989
- namespace.addMultiStateDiscrete({
990
- organizedBy: DADiscreteTypeFolder,
991
- nodeId: "s=MultiStateDiscrete002",
992
- browseName: "MultiStateDiscrete002",
993
- enumStrings: ["Red", "Orange", "Green"],
994
- value: 1 // Orange
995
- });
996
- // MultiStateDiscrete002
997
- namespace.addMultiStateDiscrete({
998
- organizedBy: DADiscreteTypeFolder,
999
- nodeId: "s=MultiStateDiscrete003",
1000
- browseName: "MultiStateDiscrete003",
1001
- enumStrings: ["Red", "Orange", "Green"],
1002
- value: 1 // Orange
1003
- });
1004
- // MultiStateDiscrete002
1005
- namespace.addMultiStateDiscrete({
1006
- organizedBy: DADiscreteTypeFolder,
1007
- nodeId: "s=MultiStateDiscrete004",
1008
- browseName: "MultiStateDiscrete004",
1009
- enumStrings: ["Red", "Orange", "Green"],
1010
- value: 1 // Orange
1011
- });
1012
- // MultiStateDiscrete002
1013
- namespace.addMultiStateDiscrete({
1014
- organizedBy: DADiscreteTypeFolder,
1015
- nodeId: "s=MultiStateDiscrete005",
1016
- browseName: "MultiStateDiscrete005",
1017
- enumStrings: ["Red", "Orange", "Green"],
1018
- value: 1 // Orange
1019
- });
1020
- }
1021
- function add_multi_state_value_discrete_variables(namespaceDemo, parentFolder) {
1022
- const multistateValueDiscreteTypeFolder = namespaceDemo.addObject({
1023
- organizedBy: parentFolder,
1024
- typeDefinition: "FolderType",
1025
- browseName: "Simulation_DA_MultiStateValueDiscreteType",
1026
- nodeId: "s=Simulation_DA_MultiStateValueDiscreteType"
1027
- });
1028
- function _add_multi_state_variable(parentFolder, dataType, value, enumValues) {
1029
- const name = dataType + "MultiStateValueDiscrete";
1030
- const nodeId = "s=" + name;
1031
- const prop = namespaceDemo.addMultiStateValueDiscrete({
1032
- organizedBy: parentFolder,
1033
- browseName: name,
1034
- nodeId,
1035
- dataType,
1036
- enumValues,
1037
- value: 0x0000 // Zero
1038
- });
1039
- }
1040
- const enumValueUnsigned = { Zero: 0x00, One: 0x01, Two: 0x02, Three: 0x03, Four: 0x04, Five: 0x05, Six: 0x06, Seven: 0x07 };
1041
- const enumValueSigned = Object.assign({ MinusOne: -1, MinusTwo: -2, MinusThree: -3 }, enumValueUnsigned);
1042
- const data = [
1043
- { dataType: "Int16", value: -1, enumValue: enumValueSigned },
1044
- { dataType: "UInt16", value: 10, enumValue: enumValueUnsigned },
1045
- { dataType: "Int32", value: -1, enumValue: enumValueSigned },
1046
- { dataType: "UInt32", value: 100, enumValue: enumValueUnsigned },
1047
- { dataType: "Int64", value: [0, 0], enumValue: enumValueUnsigned },
1048
- { dataType: "UInt64", value: [0, 0], enumValue: enumValueSigned },
1049
- { dataType: "Byte", value: 1, enumValue: enumValueUnsigned },
1050
- { dataType: "SByte", value: -1, enumValue: enumValueSigned }
1051
- ];
1052
- data.forEach((e) => {
1053
- _add_multi_state_variable(multistateValueDiscreteTypeFolder, e.dataType, e.value, e.enumValue);
1054
- });
1055
- }
1056
- function add_ObjectWithMethod(namespace, parentFolder) {
1057
- const myObject = namespace.addObject({
1058
- nodeId: "s=ObjectWithMethods",
1059
- organizedBy: parentFolder,
1060
- browseName: "ObjectWithMethods"
1061
- });
1062
- const methodNoArgs = namespace.addMethod(myObject, {
1063
- browseName: "MethodNoArgs",
1064
- nodeId: "s=MethodNoArgs"
1065
- // xx inputArguments: [],
1066
- // xx outputArguments: []
1067
- });
1068
- (0, node_opcua_assert_1.assert)((0, node_opcua_nodeid_1.makeNodeId)("MethodNoArgs", namespace.index)
1069
- .toString()
1070
- .match(/s=MethodNoArgs/));
1071
- (0, node_opcua_assert_1.assert)(methodNoArgs.nodeId.toString().match(/s=MethodNoArgs/));
1072
- methodNoArgs.bindMethod((inputArguments, context, callback) => {
1073
- const callMethodResult = {
1074
- statusCode: node_opcua_status_code_1.StatusCodes.Good,
1075
- outputArguments: []
1076
- };
1077
- callback(null, callMethodResult);
1078
- });
1079
- const methodIO = namespace.addMethod(myObject, {
1080
- /// xx modellingRule: "Mandatory",
1081
- browseName: "MethodIO",
1082
- nodeId: (0, node_opcua_nodeid_1.makeNodeId)("MethodIO", namespace.index),
1083
- inputArguments: [
1084
- {
1085
- name: "ShutterLag",
1086
- description: { text: "specifies the number of seconds to wait before the picture is taken " },
1087
- dataType: node_opcua_variant_1.DataType.UInt32
1088
- }
1089
- ],
1090
- outputArguments: [
1091
- {
1092
- name: "Result",
1093
- description: { text: "the result" },
1094
- dataType: "Int32"
1095
- }
1096
- ]
1097
- });
1098
- methodIO.bindMethod((inputArguments, context, callback) => {
1099
- const callMethodResult = {
1100
- statusCode: node_opcua_status_code_1.StatusCodes.Good,
1101
- outputArguments: [
1102
- {
1103
- dataType: node_opcua_variant_1.DataType.Int32,
1104
- value: 42
1105
- }
1106
- ]
1107
- };
1108
- callback(null, callMethodResult);
1109
- });
1110
- const methodI = namespace.addMethod(myObject, {
1111
- /// xx modellingRule: "Mandatory",
1112
- browseName: "MethodI",
1113
- nodeId: "s=MethodI",
1114
- inputArguments: [
1115
- {
1116
- name: "ShutterLag",
1117
- description: { text: "specifies the number of seconds to wait before the picture is taken " },
1118
- dataType: node_opcua_variant_1.DataType.UInt32
1119
- }
1120
- ]
1121
- // xx outputArguments: []
1122
- });
1123
- methodI.bindMethod((inputArguments, context, callback) => {
1124
- const callMethodResult = {
1125
- statusCode: node_opcua_status_code_1.StatusCodes.Good,
1126
- outputArguments: []
1127
- };
1128
- callback(null, callMethodResult);
1129
- });
1130
- const methodO = namespace.addMethod(myObject, {
1131
- /// xx modellingRule: "Mandatory",
1132
- browseName: "MethodO",
1133
- nodeId: "s=MethodO",
1134
- // xx inputArguments: [],
1135
- outputArguments: [
1136
- {
1137
- name: "Result",
1138
- description: { text: "the result" },
1139
- dataType: "Int32"
1140
- }
1141
- ]
1142
- });
1143
- methodO.bindMethod((inputArguments, context, callback) => {
1144
- const callMethodResult = {
1145
- statusCode: node_opcua_status_code_1.StatusCodes.Good,
1146
- outputArguments: [
1147
- {
1148
- dataType: node_opcua_variant_1.DataType.Int32,
1149
- value: 42
1150
- }
1151
- ]
1152
- };
1153
- callback(null, callMethodResult);
1154
- });
1155
- }
1156
- function add_enumeration_variable(namespaceDemo, parentFolder) {
1157
- const addressSpace = namespaceDemo.addressSpace;
1158
- const myEnumType = namespaceDemo.addEnumerationType({
1159
- browseName: "SimulationEnumerationType",
1160
- enumeration: [
1161
- { value: 1, displayName: "RUNNING" },
1162
- { value: 2, displayName: "BLOCKED" },
1163
- { value: 3, displayName: "IDLE" },
1164
- { value: 4, displayName: "UNDER MAINTENANCE" }
1165
- ]
1166
- });
1167
- // now instantiate a variable that have this type.
1168
- const e = namespaceDemo.addVariable({
1169
- organizedBy: parentFolder,
1170
- propertyOf: addressSpace.rootFolder.objects.server.vendorServerInfos,
1171
- dataType: myEnumType,
1172
- browseName: "RunningState",
1173
- });
1174
- e.writeEnumValue("RUNNING");
1175
- }
1176
- function add_trigger_nodes(namespace, parentFolder) {
1177
- const addressSpace = namespace.addressSpace;
1178
- const myEvtType = namespace.findObjectType("MyEventType") ||
1179
- namespace.addEventType({
1180
- browseName: "MyEventType",
1181
- subtypeOf: "BaseEventType" // should be implicit
1182
- });
1183
- // add 2 nodes that generate an event when ever they are written to.
1184
- function _add_trigger_node(parent, browseName, nodeId) {
1185
- const triggerNode = namespace.addVariable({
1186
- browseName,
1187
- nodeId,
1188
- eventSourceOf: parent,
1189
- dataType: "Double",
1190
- typeDefinition: (0, node_opcua_nodeid_1.makeNodeId)(68)
1191
- });
1192
- let value = 100.0;
1193
- const getFunc = () => {
1194
- return new node_opcua_variant_1.Variant({
1195
- dataType: node_opcua_variant_1.DataType.Double,
1196
- value
1197
- });
1198
- };
1199
- const setFunc = (variant) => {
1200
- value = variant.value;
1201
- const server = addressSpace.rootFolder.objects.server;
1202
- server.raiseEvent(myEvtType, {
1203
- message: {
1204
- dataType: node_opcua_variant_1.DataType.LocalizedText,
1205
- value: { text: "Hello World" }
1206
- },
1207
- severity: {
1208
- dataType: node_opcua_variant_1.DataType.UInt32,
1209
- value: 32
1210
- }
1211
- });
1212
- };
1213
- const options = {
1214
- get: getFunc,
1215
- set: setFunc
1216
- };
1217
- triggerNode.bindVariable(options);
1218
- }
1219
- const sampleTriggerNode = namespace.addObject({
1220
- browseName: "SampleTriggerNode",
1221
- eventNotifier: 0x1,
1222
- organizedBy: parentFolder
1223
- });
1224
- const triggerNode01 = _add_trigger_node(sampleTriggerNode, "TriggerNode01", "s=TriggerNode01");
1225
- const triggerNode02 = _add_trigger_node(sampleTriggerNode, "TriggerNode02", "s=TriggerNode02");
1226
- }
1227
- function add_sampleView(namespace) {
1228
- const addressSpace = namespace.addressSpace;
1229
- const view1 = namespace.addView({
1230
- organizedBy: addressSpace.rootFolder.views,
1231
- browseName: "SampleView",
1232
- nodeId: "s=SampleView"
1233
- });
1234
- view1.addReference({
1235
- nodeId: "i=2256",
1236
- referenceType: "Organizes"
1237
- });
1238
- view1.addReference({
1239
- nodeId: "i=11715",
1240
- referenceType: "Organizes"
1241
- });
1242
- const view2 = namespace.addView({
1243
- organizedBy: addressSpace.rootFolder.views,
1244
- browseName: "OtherSampleView",
1245
- nodeId: "s=OtherSampleView"
1246
- });
1247
- }
1248
- function build_address_space_for_conformance_testing(addressSpace, options) {
1249
- const namespace = addressSpace.registerNamespace("urn://node-opcua-simulator");
1250
- options = options || {};
1251
- options.mass_variable = options.mass_variable || false;
1252
- const objectsFolder = addressSpace.findNode("ObjectsFolder");
1253
- const simulationFolder = namespace.addFolder(objectsFolder, {
1254
- browseName: "Simulation",
1255
- nodeId: "s=SimulationFolder"
1256
- });
1257
- add_access_right_variables(namespace, simulationFolder);
1258
- const staticVariablesFolder = namespace.addFolder(simulationFolder, {
1259
- browseName: "Static"
1260
- });
1261
- const allProfileFolder = namespace.addFolder(staticVariablesFolder, {
1262
- browseName: "All Profiles"
1263
- });
1264
- // Scalars/Array/MultiDim array of all sorts
1265
- add_static_variables(namespace, allProfileFolder);
1266
- if (options.mass_variables) {
1267
- add_mass_variables(namespace, allProfileFolder);
1268
- }
1269
- add_analog_data_items(namespace, allProfileFolder);
1270
- const dynamicVariablesFolder = namespace.addFolder(simulationFolder, {
1271
- browseName: "Dynamic"
1272
- });
1273
- add_simulation_variables(namespace, dynamicVariablesFolder);
1274
- add_very_large_array_variables(namespace, staticVariablesFolder);
1275
- add_path_10deep(namespace, simulationFolder);
1276
- add_node_with_references(namespace, simulationFolder);
1277
- add_ObjectWithMethod(namespace, simulationFolder);
1278
- (0, testHelpers_1.add_eventGeneratorObject)(namespace, simulationFolder);
1279
- add_sampleView(namespace);
1280
- add_enumeration_variable(namespace, simulationFolder);
1281
- add_multi_state_value_discrete_variables(namespace, simulationFolder);
1282
- add_two_state_discrete_variables(namespace, simulationFolder);
1283
- add_multi_state_discrete_variable(namespace, simulationFolder);
1284
- add_trigger_nodes(namespace, simulationFolder);
1285
- }
1286
- exports.build_address_space_for_conformance_testing = build_address_space_for_conformance_testing;
1287
- //# sourceMappingURL=address_space_for_conformance_testing.js.map