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