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