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.
- package/dist/address_space_for_conformance_testing.d.ts +6 -2
- package/dist/address_space_for_conformance_testing.js +27 -1306
- package/dist/address_space_for_conformance_testing.js.map +1 -1
- package/dist/conformance_testing/access_right_variables.d.ts +5 -0
- package/dist/conformance_testing/access_right_variables.js +45 -0
- package/dist/conformance_testing/access_right_variables.js.map +1 -0
- package/dist/conformance_testing/analog_data_items.d.ts +5 -0
- package/dist/conformance_testing/analog_data_items.js +117 -0
- package/dist/conformance_testing/analog_data_items.js.map +1 -0
- package/dist/conformance_testing/discrete_variables.d.ts +4 -0
- package/dist/conformance_testing/discrete_variables.js +111 -0
- package/dist/conformance_testing/discrete_variables.js.map +1 -0
- package/dist/conformance_testing/enumeration_variable.d.ts +5 -0
- package/dist/conformance_testing/enumeration_variable.js +24 -0
- package/dist/conformance_testing/enumeration_variable.js.map +1 -0
- package/dist/conformance_testing/helpers.d.ts +13 -0
- package/dist/conformance_testing/helpers.js +204 -0
- package/dist/conformance_testing/helpers.js.map +1 -0
- package/dist/conformance_testing/mass_variables.d.ts +5 -0
- package/dist/conformance_testing/mass_variables.js +31 -0
- package/dist/conformance_testing/mass_variables.js.map +1 -0
- package/dist/conformance_testing/node_with_references.d.ts +5 -0
- package/dist/conformance_testing/node_with_references.js +119 -0
- package/dist/conformance_testing/node_with_references.js.map +1 -0
- package/dist/conformance_testing/object_with_methods.d.ts +5 -0
- package/dist/conformance_testing/object_with_methods.js +85 -0
- package/dist/conformance_testing/object_with_methods.js.map +1 -0
- package/dist/conformance_testing/path_and_large_arrays.d.ts +6 -0
- package/dist/conformance_testing/path_and_large_arrays.js +33 -0
- package/dist/conformance_testing/path_and_large_arrays.js.map +1 -0
- package/dist/conformance_testing/sample_view.d.ts +5 -0
- package/dist/conformance_testing/sample_view.js +25 -0
- package/dist/conformance_testing/sample_view.js.map +1 -0
- package/dist/conformance_testing/simulation_variables.d.ts +5 -0
- package/dist/conformance_testing/simulation_variables.js +113 -0
- package/dist/conformance_testing/simulation_variables.js.map +1 -0
- package/dist/conformance_testing/static_variables.d.ts +2 -0
- package/dist/conformance_testing/static_variables.js +70 -0
- package/dist/conformance_testing/static_variables.js.map +1 -0
- package/dist/conformance_testing/trigger_nodes.d.ts +5 -0
- package/dist/conformance_testing/trigger_nodes.js +41 -0
- package/dist/conformance_testing/trigger_nodes.js.map +1 -0
- package/dist/conformance_testing/type_defaults.d.ts +54 -0
- package/dist/conformance_testing/type_defaults.js +96 -0
- package/dist/conformance_testing/type_defaults.js.map +1 -0
- package/package.json +12 -12
- package/src/address_space_for_conformance_testing.ts +34 -1494
- package/src/conformance_testing/access_right_variables.ts +55 -0
- package/src/conformance_testing/analog_data_items.ts +136 -0
- package/src/conformance_testing/discrete_variables.ts +131 -0
- package/src/conformance_testing/enumeration_variable.ts +27 -0
- package/src/conformance_testing/helpers.ts +226 -0
- package/src/conformance_testing/mass_variables.ts +42 -0
- package/src/conformance_testing/node_with_references.ts +130 -0
- package/src/conformance_testing/object_with_methods.ts +93 -0
- package/src/conformance_testing/path_and_large_arrays.ts +35 -0
- package/src/conformance_testing/sample_view.ts +28 -0
- package/src/conformance_testing/simulation_variables.ts +129 -0
- package/src/conformance_testing/static_variables.ts +71 -0
- package/src/conformance_testing/trigger_nodes.ts +49 -0
- 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
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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
|
|
34
|
+
await (0, static_variables_1.addStaticVariables)(namespace, allProfileFolder);
|
|
1314
35
|
if (options.mass_variables) {
|
|
1315
|
-
|
|
36
|
+
(0, mass_variables_1.addMassVariables)(namespace, allProfileFolder);
|
|
1316
37
|
}
|
|
1317
|
-
|
|
38
|
+
(0, analog_data_items_1.addAnalogDataItems)(namespace, allProfileFolder);
|
|
1318
39
|
const dynamicVariablesFolder = namespace.addFolder(simulationFolder, {
|
|
1319
40
|
browseName: "Dynamic"
|
|
1320
41
|
});
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
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
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
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
|