node-opcua-address-space 2.81.0 → 2.83.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/source/loader/ensure_datatype_extracted.js +1 -1
- package/dist/source/loader/ensure_datatype_extracted.js.map +1 -1
- package/dist/source/loader/load_nodeset2.js +9 -22
- package/dist/source/loader/load_nodeset2.js.map +1 -1
- package/dist/source/xml_writer.d.ts +5 -1
- package/dist/src/address_space.js +1 -1
- package/dist/src/address_space.js.map +1 -1
- package/dist/src/apply_condition_refresh.d.ts +1 -1
- package/dist/src/apply_condition_refresh.js +5 -5
- package/dist/src/apply_condition_refresh.js.map +1 -1
- package/dist/src/base_node_impl.d.ts +1 -0
- package/dist/src/base_node_impl.js +83 -54
- package/dist/src/base_node_impl.js.map +1 -1
- package/dist/src/base_node_private.d.ts +23 -3
- package/dist/src/base_node_private.js +3 -2
- package/dist/src/base_node_private.js.map +1 -1
- package/dist/src/index_current.d.ts +1 -1
- package/dist/src/index_current.js +2 -3
- package/dist/src/index_current.js.map +1 -1
- package/dist/src/namespace_impl.d.ts +4 -1
- package/dist/src/namespace_impl.js +10 -2
- package/dist/src/namespace_impl.js.map +1 -1
- package/dist/src/namespace_private.d.ts +2 -1
- package/dist/src/namespace_private.js.map +1 -1
- package/dist/src/nodeset_tools/construct_namespace_dependency.d.ts +3 -1
- package/dist/src/nodeset_tools/construct_namespace_dependency.js +35 -5
- package/dist/src/nodeset_tools/construct_namespace_dependency.js.map +1 -1
- package/dist/src/nodeset_tools/nodeset_to_xml.d.ts +4 -2
- package/dist/src/nodeset_tools/nodeset_to_xml.js +44 -59
- package/dist/src/nodeset_tools/nodeset_to_xml.js.map +1 -1
- package/dist/src/ua_data_type_impl.d.ts +2 -0
- package/dist/src/ua_data_type_impl.js +10 -15
- package/dist/src/ua_data_type_impl.js.map +1 -1
- package/dist/src/ua_reference_type_impl.d.ts +1 -1
- package/dist/src/ua_reference_type_impl.js +1 -1
- package/dist/src/ua_reference_type_impl.js.map +1 -1
- package/dist/src/ua_variable_impl.d.ts +2 -0
- package/dist/src/ua_variable_impl.js +49 -11
- package/dist/src/ua_variable_impl.js.map +1 -1
- package/package.json +40 -40
- package/source/loader/ensure_datatype_extracted.ts +1 -1
- package/source/loader/load_nodeset2.ts +22 -36
- package/source/xml_writer.ts +5 -1
- package/src/address_space.ts +1 -2
- package/src/apply_condition_refresh.ts +5 -5
- package/src/base_node_impl.ts +86 -59
- package/src/base_node_private.ts +26 -10
- package/src/index_current.ts +1 -1
- package/src/namespace_impl.ts +13 -3
- package/src/namespace_private.ts +7 -1
- package/src/nodeset_tools/construct_namespace_dependency.ts +42 -5
- package/src/nodeset_tools/nodeset_to_xml.ts +57 -84
- package/src/ua_data_type_impl.ts +12 -15
- package/src/ua_reference_type_impl.ts +2 -2
- package/src/ua_variable_impl.ts +74 -31
- package/test_helpers/test_fixtures/dataType_with_union.xml +90 -1
- package/test_helpers/test_fixtures/datatype_as_per_1.04.xml +38 -10
package/src/ua_variable_impl.ts
CHANGED
|
@@ -348,23 +348,39 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
348
348
|
|
|
349
349
|
this.semantic_version = 0;
|
|
350
350
|
}
|
|
351
|
-
|
|
352
|
-
|
|
351
|
+
private checkAccessLevelPrivate(
|
|
352
|
+
_context: ISessionContext,
|
|
353
|
+
accessLevel: AccessLevelFlag): boolean {
|
|
354
|
+
if (this.userAccessLevel === undefined) {
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
return (this.userAccessLevel & accessLevel) === accessLevel;
|
|
358
|
+
}
|
|
359
|
+
private checkPermissionPrivate(
|
|
353
360
|
context: ISessionContext,
|
|
354
361
|
permission: PermissionType,
|
|
355
|
-
|
|
356
|
-
|
|
362
|
+
): boolean {
|
|
363
|
+
if (!context) return true;
|
|
357
364
|
assert(context instanceof SessionContext);
|
|
358
365
|
if (context.checkPermission) {
|
|
359
|
-
|
|
366
|
+
if (!(context.checkPermission instanceof Function)) {
|
|
367
|
+
errorLog("context checkPermission is not a function");
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
360
370
|
if (!context.checkPermission(this, permission)) {
|
|
361
371
|
return false;
|
|
362
372
|
}
|
|
363
373
|
}
|
|
364
|
-
|
|
365
|
-
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
private checkPermissionAndAccessLevelPrivate(
|
|
377
|
+
context: ISessionContext,
|
|
378
|
+
permission: PermissionType,
|
|
379
|
+
accessLevel: AccessLevelFlag): boolean {
|
|
380
|
+
if (!this.checkPermissionPrivate(context, permission)) {
|
|
381
|
+
return false;
|
|
366
382
|
}
|
|
367
|
-
return
|
|
383
|
+
return this.checkAccessLevelPrivate(context, accessLevel);
|
|
368
384
|
}
|
|
369
385
|
|
|
370
386
|
public isReadable(context: ISessionContext): boolean {
|
|
@@ -375,7 +391,10 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
375
391
|
if (!this.isReadable(context)) {
|
|
376
392
|
return false;
|
|
377
393
|
}
|
|
378
|
-
|
|
394
|
+
if (!this.checkPermissionPrivate(context, PermissionType.Read)) {
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
return this.checkAccessLevelPrivate(context, AccessLevelFlag.CurrentRead);
|
|
379
398
|
}
|
|
380
399
|
|
|
381
400
|
public isWritable(context: ISessionContext): boolean {
|
|
@@ -451,9 +470,12 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
451
470
|
if (!this.isReadable(context)) {
|
|
452
471
|
return new DataValue({ statusCode: StatusCodes.BadNotReadable });
|
|
453
472
|
}
|
|
454
|
-
if (!this.
|
|
473
|
+
if (!this.checkPermissionPrivate(context, PermissionType.Read)) {
|
|
455
474
|
return new DataValue({ statusCode: StatusCodes.BadUserAccessDenied });
|
|
456
475
|
}
|
|
476
|
+
if (!this.isUserReadable(context)) {
|
|
477
|
+
return new DataValue({ statusCode: StatusCodes.BadNotReadable });
|
|
478
|
+
}
|
|
457
479
|
if (!isValidDataEncoding(dataEncoding)) {
|
|
458
480
|
return new DataValue({ statusCode: StatusCodes.BadDataEncodingInvalid });
|
|
459
481
|
}
|
|
@@ -484,10 +506,10 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
484
506
|
) {
|
|
485
507
|
debugLog(
|
|
486
508
|
chalk.red(" Warning: UAVariable#readValue ") +
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
509
|
+
chalk.cyan(this.browseName.toString()) +
|
|
510
|
+
" (" +
|
|
511
|
+
chalk.yellow(this.nodeId.toString()) +
|
|
512
|
+
") exists but dataValue has not been defined"
|
|
491
513
|
);
|
|
492
514
|
}
|
|
493
515
|
return dataValue;
|
|
@@ -689,9 +711,9 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
689
711
|
if (variant.dataType === null || variant.dataType === undefined) {
|
|
690
712
|
throw new Error(
|
|
691
713
|
"Variant must provide a valid dataType : variant = " +
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
714
|
+
variant.toString() +
|
|
715
|
+
" this.dataType= " +
|
|
716
|
+
this.dataType.toString()
|
|
695
717
|
);
|
|
696
718
|
}
|
|
697
719
|
if (
|
|
@@ -700,9 +722,9 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
700
722
|
) {
|
|
701
723
|
throw new Error(
|
|
702
724
|
"Variant must provide a valid Boolean : variant = " +
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
725
|
+
variant.toString() +
|
|
726
|
+
" this.dataType= " +
|
|
727
|
+
this.dataType.toString()
|
|
706
728
|
);
|
|
707
729
|
}
|
|
708
730
|
if (
|
|
@@ -713,9 +735,9 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
713
735
|
) {
|
|
714
736
|
throw new Error(
|
|
715
737
|
"Variant must provide a valid LocalizedText : variant = " +
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
738
|
+
variant.toString() +
|
|
739
|
+
" this.dataType= " +
|
|
740
|
+
this.dataType.toString()
|
|
719
741
|
);
|
|
720
742
|
}
|
|
721
743
|
}
|
|
@@ -870,8 +892,13 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
870
892
|
if (!this.isWritable(context)) {
|
|
871
893
|
return callback!(null, StatusCodes.BadNotWritable);
|
|
872
894
|
}
|
|
895
|
+
if (!this.checkPermissionPrivate(context, PermissionType.Write)) {
|
|
896
|
+
return new DataValue({ statusCode: StatusCodes.BadUserAccessDenied });
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
|
|
873
900
|
if (!this.isUserWritable(context)) {
|
|
874
|
-
return callback!(null, StatusCodes.
|
|
901
|
+
return callback!(null, StatusCodes.BadWriteNotSupported);
|
|
875
902
|
}
|
|
876
903
|
|
|
877
904
|
// adjust special case
|
|
@@ -997,9 +1024,14 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
997
1024
|
if (writeValue.value!.value.dataType !== DataType.Boolean) {
|
|
998
1025
|
return callback(null, StatusCodes.BadTypeMismatch);
|
|
999
1026
|
}
|
|
1000
|
-
if (!this.
|
|
1027
|
+
if (!this.checkPermissionPrivate(context, PermissionType.WriteHistorizing)) {
|
|
1001
1028
|
return callback(null, StatusCodes.BadUserAccessDenied);
|
|
1002
1029
|
}
|
|
1030
|
+
|
|
1031
|
+
if (!this.canUserWriteHistorizingAttribute(context)) {
|
|
1032
|
+
return callback(null, StatusCodes.BadHistoryOperationUnsupported);
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1003
1035
|
// if the variable has no historizing in place reject
|
|
1004
1036
|
if (!this.getChildByName("HA Configuration")) {
|
|
1005
1037
|
return callback(null, StatusCodes.BadNotSupported);
|
|
@@ -1227,11 +1259,16 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
1227
1259
|
const dataValue = new DataValue({ statusCode: StatusCodes.BadNotReadable });
|
|
1228
1260
|
innerCallback(null, dataValue);
|
|
1229
1261
|
};
|
|
1230
|
-
} else if (!this.
|
|
1262
|
+
} else if (!this.checkPermissionPrivate(context, PermissionType.Read)) {
|
|
1231
1263
|
func = (innerCallback: (err: Error | null, dataValue: DataValue) => void) => {
|
|
1232
1264
|
const dataValue = new DataValue({ statusCode: StatusCodes.BadUserAccessDenied });
|
|
1233
1265
|
innerCallback(null, dataValue);
|
|
1234
1266
|
};
|
|
1267
|
+
} else if (!this.isUserReadable(context)) {
|
|
1268
|
+
func = (innerCallback: (err: Error | null, dataValue: DataValue) => void) => {
|
|
1269
|
+
const dataValue = new DataValue({ statusCode: StatusCodes.BadNotReadable });
|
|
1270
|
+
innerCallback(null, dataValue);
|
|
1271
|
+
};
|
|
1235
1272
|
} else {
|
|
1236
1273
|
func = typeof this.refreshFunc === "function" ? this.asyncRefresh.bind(this, new Date()) : readImmediate;
|
|
1237
1274
|
}
|
|
@@ -1560,12 +1597,19 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
1560
1597
|
continuationData: ContinuationData,
|
|
1561
1598
|
callback: CallbackT<HistoryReadResult>
|
|
1562
1599
|
): void {
|
|
1563
|
-
|
|
1600
|
+
|
|
1601
|
+
if (!this.checkPermissionPrivate(context, PermissionType.ReadHistory)) {
|
|
1564
1602
|
const result = new HistoryReadResult({
|
|
1565
1603
|
statusCode: StatusCodes.BadUserAccessDenied
|
|
1566
1604
|
});
|
|
1567
1605
|
callback(null, result);
|
|
1568
1606
|
}
|
|
1607
|
+
if (!this.canUserReadHistory(context)) {
|
|
1608
|
+
const result = new HistoryReadResult({
|
|
1609
|
+
statusCode: StatusCodes.BadHistoryOperationUnsupported
|
|
1610
|
+
});
|
|
1611
|
+
callback(null, result);
|
|
1612
|
+
}
|
|
1569
1613
|
const result = new HistoryReadResult({
|
|
1570
1614
|
statusCode: StatusCodes.BadHistoryOperationUnsupported
|
|
1571
1615
|
});
|
|
@@ -1634,8 +1678,7 @@ export class UAVariableImpl extends BaseNodeImpl implements UAVariable {
|
|
|
1634
1678
|
const nbElements = dataValue.value.dimensions.reduce((acc, x) => acc * x, 1);
|
|
1635
1679
|
if (dataValue.value.value.length !== 0 && dataValue.value.value.length !== nbElements) {
|
|
1636
1680
|
throw new Error(
|
|
1637
|
-
`Internal Error: matrix dimension doesn't match the number of element in the array : ${dataValue.toString()} "\n expecting ${nbElements} elements but got ${
|
|
1638
|
-
dataValue.value.value.length
|
|
1681
|
+
`Internal Error: matrix dimension doesn't match the number of element in the array : ${dataValue.toString()} "\n expecting ${nbElements} elements but got ${dataValue.value.value.length
|
|
1639
1682
|
}`
|
|
1640
1683
|
);
|
|
1641
1684
|
}
|
|
@@ -1984,7 +2027,7 @@ function _Variable_bind_with_timestamped_get(
|
|
|
1984
2027
|
errorLog(
|
|
1985
2028
|
chalk.red(" Bind variable error: "),
|
|
1986
2029
|
" the timestamped_get function must return a DataValue or a Promise<DataValue>" +
|
|
1987
|
-
|
|
2030
|
+
"\n value_check.constructor.name ",
|
|
1988
2031
|
dataValue_verify ? dataValue_verify.constructor.name : "null"
|
|
1989
2032
|
);
|
|
1990
2033
|
|
|
@@ -2179,7 +2222,7 @@ export interface UAVariableImplT<T, DT extends DataType> extends UAVariableImpl,
|
|
|
2179
2222
|
writeValue(context: ISessionContext, dataValue: DataValueT<T, DT>, callback: StatusCodeCallback): void;
|
|
2180
2223
|
writeValue(context: ISessionContext, dataValue: DataValueT<T, DT>, indexRange?: NumericRange | null): Promise<StatusCode>;
|
|
2181
2224
|
}
|
|
2182
|
-
export class UAVariableImplT<T, DT extends DataType> extends UAVariableImpl {}
|
|
2225
|
+
export class UAVariableImplT<T, DT extends DataType> extends UAVariableImpl { }
|
|
2183
2226
|
// x TO DO
|
|
2184
2227
|
// require("./data_access/ua_variable_data_access");
|
|
2185
2228
|
// require("./historical_access/ua_variable_history");
|
|
@@ -1 +1,90 @@
|
|
|
1
|
-
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<UANodeSet xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" LastModified="2020-01-08T00:00:00Z"
|
|
4
|
+
xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd">
|
|
5
|
+
<Models>
|
|
6
|
+
<Model ModelUri="http://mynodeset/" Version="1.01" PublicationDate="2020-06-18T13:52:03Z">
|
|
7
|
+
<RequiredModel ModelUri="http://opcfoundation.org/UA/" Version="1.03" PublicationDate="2019-09-09T00:00:00Z" />
|
|
8
|
+
</Model>
|
|
9
|
+
</Models>
|
|
10
|
+
<NamespaceUris>
|
|
11
|
+
<Uri>http://mynodeset/</Uri>
|
|
12
|
+
</NamespaceUris>
|
|
13
|
+
|
|
14
|
+
<Aliases>
|
|
15
|
+
<Alias Alias="Boolean">i=1</Alias>
|
|
16
|
+
<Alias Alias="SByte">i=2</Alias>
|
|
17
|
+
<Alias Alias="Byte">i=3</Alias>
|
|
18
|
+
<Alias Alias="Int16">i=4</Alias>
|
|
19
|
+
<Alias Alias="UInt16">i=5</Alias>
|
|
20
|
+
<Alias Alias="Int32">i=6</Alias>
|
|
21
|
+
<Alias Alias="UInt32">i=7</Alias>
|
|
22
|
+
<Alias Alias="Int64">i=8</Alias>
|
|
23
|
+
<Alias Alias="UInt64">i=9</Alias>
|
|
24
|
+
<Alias Alias="Float">i=10</Alias>
|
|
25
|
+
<Alias Alias="Double">i=11</Alias>
|
|
26
|
+
<Alias Alias="DateTime">i=13</Alias>
|
|
27
|
+
<Alias Alias="String">i=12</Alias>
|
|
28
|
+
<Alias Alias="ByteString">i=15</Alias>
|
|
29
|
+
<Alias Alias="Guid">i=14</Alias>
|
|
30
|
+
<Alias Alias="XmlElement">i=16</Alias>
|
|
31
|
+
<Alias Alias="NodeId">i=17</Alias>
|
|
32
|
+
<Alias Alias="ExpandedNodeId">i=18</Alias>
|
|
33
|
+
<Alias Alias="QualifiedName">i=20</Alias>
|
|
34
|
+
<Alias Alias="LocalizedText">i=21</Alias>
|
|
35
|
+
<Alias Alias="StatusCode">i=19</Alias>
|
|
36
|
+
<Alias Alias="Structure">i=22</Alias>
|
|
37
|
+
<Alias Alias="Number">i=26</Alias>
|
|
38
|
+
<Alias Alias="Integer">i=27</Alias>
|
|
39
|
+
<Alias Alias="UInteger">i=28</Alias>
|
|
40
|
+
<Alias Alias="HasComponent">i=47</Alias>
|
|
41
|
+
<Alias Alias="HasProperty">i=46</Alias>
|
|
42
|
+
<Alias Alias="Organizes">i=35</Alias>
|
|
43
|
+
<Alias Alias="HasEventSource">i=36</Alias>
|
|
44
|
+
<Alias Alias="HasNotifier">i=48</Alias>
|
|
45
|
+
<Alias Alias="HasSubtype">i=45</Alias>
|
|
46
|
+
<Alias Alias="HasTypeDefinition">i=40</Alias>
|
|
47
|
+
<Alias Alias="HasModellingRule">i=37</Alias>
|
|
48
|
+
<Alias Alias="HasEncoding">i=38</Alias>
|
|
49
|
+
<Alias Alias="HasDescription">i=39</Alias>
|
|
50
|
+
</Aliases>
|
|
51
|
+
|
|
52
|
+
<UADataType NodeId="ns=1;i=1000" BrowseName="1:CustomUnion">
|
|
53
|
+
<References>
|
|
54
|
+
<Reference ReferenceType="HasSubtype" IsForward="false">i=12756</Reference>
|
|
55
|
+
<Reference ReferenceType="HasEncoding">ns=1;i=1001</Reference>
|
|
56
|
+
</References>
|
|
57
|
+
<Definition Name="1:CustomUnion" IsUnion="true">
|
|
58
|
+
<Field Name="ByteString" DataType="ByteString" />
|
|
59
|
+
<Field Name="String" DataType="String" />
|
|
60
|
+
<Field Name="Custom" />
|
|
61
|
+
</Definition>
|
|
62
|
+
</UADataType>
|
|
63
|
+
<UAObject NodeId="ns=1;i=1001" BrowseName="Default Binary" SymbolicName="DefaultBinary">
|
|
64
|
+
<DisplayName>Default Binary</DisplayName>
|
|
65
|
+
<References>
|
|
66
|
+
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
|
|
67
|
+
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=1000</Reference>
|
|
68
|
+
</References>
|
|
69
|
+
</UAObject>
|
|
70
|
+
|
|
71
|
+
<UADataType NodeId="ns=1;i=2000" BrowseName="1:CustomStruct">
|
|
72
|
+
<References>
|
|
73
|
+
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
|
|
74
|
+
<Reference ReferenceType="HasEncoding">ns=1;i=2001</Reference>
|
|
75
|
+
</References>
|
|
76
|
+
<Definition Name="1:CustomStruct">
|
|
77
|
+
<Field Name="ByteString" DataType="ByteString" />
|
|
78
|
+
<Field Name="String" DataType="String" />
|
|
79
|
+
<Field Name="Custom" />
|
|
80
|
+
</Definition>
|
|
81
|
+
</UADataType>
|
|
82
|
+
<UAObject NodeId="ns=1;i=2001" BrowseName="Default Binary" SymbolicName="DefaultBinary">
|
|
83
|
+
<DisplayName>Default Binary</DisplayName>
|
|
84
|
+
<References>
|
|
85
|
+
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
|
|
86
|
+
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=2x²000</Reference>
|
|
87
|
+
</References>
|
|
88
|
+
</UAObject>
|
|
89
|
+
|
|
90
|
+
</UANodeSet>
|
|
@@ -7,15 +7,15 @@
|
|
|
7
7
|
</NamespaceUris>
|
|
8
8
|
<Models>
|
|
9
9
|
<Model ModelUri="http://A" PublicationDate="2021-01-01T00:00:00Z" Version="1.00">
|
|
10
|
-
<RequiredModel ModelUri="http://opcfoundation.org/UA/" PublicationDate="2020-07-15T00:00:00Z" Version="1.04.7"/>
|
|
10
|
+
<RequiredModel ModelUri="http://opcfoundation.org/UA/" PublicationDate="2020-07-15T00:00:00Z" Version="1.04.7" />
|
|
11
11
|
</Model>
|
|
12
12
|
<Model ModelUri="http://B" PublicationDate="2021-01-01T00:00:00Z" Version="1.00">
|
|
13
|
-
<RequiredModel ModelUri="http://opcfoundation.org/UA/" PublicationDate="2020-07-15T00:00:00Z" Version="1.04.7"/>
|
|
13
|
+
<RequiredModel ModelUri="http://opcfoundation.org/UA/" PublicationDate="2020-07-15T00:00:00Z" Version="1.04.7" />
|
|
14
14
|
</Model>
|
|
15
15
|
<Model ModelUri="http://C" PublicationDate="2021-01-01T00:00:00Z" Version="1.00">
|
|
16
|
-
<RequiredModel ModelUri="http://opcfoundation.org/UA/" PublicationDate="2020-07-15T00:00:00Z" Version="1.04.7"/>
|
|
17
|
-
<RequiredModel ModelUri="http://A" PublicationDate="2021-01-01T00:00:00Z" Version="1.00"/>
|
|
18
|
-
<RequiredModel ModelUri="http://B" PublicationDate="2021-01-01T00:00:00Z" Version="1.00"/>
|
|
16
|
+
<RequiredModel ModelUri="http://opcfoundation.org/UA/" PublicationDate="2020-07-15T00:00:00Z" Version="1.04.7" />
|
|
17
|
+
<RequiredModel ModelUri="http://A" PublicationDate="2021-01-01T00:00:00Z" Version="1.00" />
|
|
18
|
+
<RequiredModel ModelUri="http://B" PublicationDate="2021-01-01T00:00:00Z" Version="1.00" />
|
|
19
19
|
</Model>
|
|
20
20
|
</Models>
|
|
21
21
|
<Aliases>
|
|
@@ -69,10 +69,10 @@
|
|
|
69
69
|
<Reference ReferenceType="HasEncoding">ns=1;i=5004</Reference>
|
|
70
70
|
</References>
|
|
71
71
|
<Definition Name="1:MixingToFilling">
|
|
72
|
-
<Field DataType="Boolean" Name="Start"/>
|
|
73
|
-
<Field DataType="Boolean" Name="Stop"/>
|
|
74
|
-
<Field DataType="Boolean" Name="Hold"/>
|
|
75
|
-
<Field DataType="Double" Name="Amount"/>
|
|
72
|
+
<Field DataType="Boolean" Name="Start" />
|
|
73
|
+
<Field DataType="Boolean" Name="Stop" />
|
|
74
|
+
<Field DataType="Boolean" Name="Hold" />
|
|
75
|
+
<Field DataType="Double" Name="Amount" />
|
|
76
76
|
</Definition>
|
|
77
77
|
</UADataType>
|
|
78
78
|
<UAObject SymbolicName="DefaultBinary" NodeId="ns=1;i=5003" BrowseName="Default Binary">
|
|
@@ -87,4 +87,32 @@
|
|
|
87
87
|
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
|
|
88
88
|
</References>
|
|
89
89
|
</UAObject>
|
|
90
|
-
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
<UADataType NodeId="ns=1;i=10001" BrowseName="1:MyStructureWithMatrix">
|
|
93
|
+
<DisplayName>MyStructureWithMatrix</DisplayName>
|
|
94
|
+
<References>
|
|
95
|
+
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
|
|
96
|
+
<Reference ReferenceType="HasEncoding">ns=1;i=10002</Reference>
|
|
97
|
+
<Reference ReferenceType="HasEncoding">ns=1;i=10003</Reference>
|
|
98
|
+
</References>
|
|
99
|
+
<Definition Name="1:MyStructureWithMatrix">
|
|
100
|
+
<Field DataType="Double" Name="MyArray" ValueRank="1" ArrayDimensions="2" />
|
|
101
|
+
<Field DataType="Double" Name="MyMatrix" ValueRank="2" ArrayDimensions="2,3" />
|
|
102
|
+
<Field DataType="Double" Name="MyCube" ValueRank="3" ArrayDimensions="2,2,2" />
|
|
103
|
+
</Definition>
|
|
104
|
+
</UADataType>
|
|
105
|
+
|
|
106
|
+
<UAObject SymbolicName="DefaultBinary" NodeId="ns=1;i=10002" BrowseName="Default Binary">
|
|
107
|
+
<DisplayName>Default Binary</DisplayName>
|
|
108
|
+
<References>
|
|
109
|
+
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
|
|
110
|
+
</References>
|
|
111
|
+
</UAObject>
|
|
112
|
+
<UAObject SymbolicName="DefaultXML" NodeId="ns=1;i=10003" BrowseName="Default XML">
|
|
113
|
+
<DisplayName>Default XML</DisplayName>
|
|
114
|
+
<References>
|
|
115
|
+
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
|
|
116
|
+
</References>
|
|
117
|
+
</UAObject>
|
|
118
|
+
</UANodeSet>
|