# Description Remove stock phrasing and correct misleading or inconsistent technical documentation. The initial two passes covered 367 Markdown files, followed by an interactive review of 169 editorial flags. The U5 interpretation originally deferred in that review has since received the upstream Mantis answer recorded by #4843; remaining server/spec follow-ups stay explicit in the CTT log. - Correct package responsibilities, migration steps, API names, ownership, protocol descriptions and links. Keep bundled migration guides synchronized. Preserve historical conclusions as historical records with separate re-check notes. - Provide at least two rendered TOC levels throughout `docs/`. Convert appropriate architecture figures to Mermaid without changing code examples, transcripts or historical quotations. - Address the October 19 feedback with concrete setup/migration instructions, corrected certificate paths and PubSub names, shorter repeated caveats, consistent XML comments, and a full review of the Concepts guide. Retain #4839's API corrections. - Integrate #4841's runtime/performance guidance and review incoming/recent prose. Preserve dated measurements rather than claiming new benchmark runs; clarify allocation ratios, startup-only processor settings, JIT warm-up and the benchmark commit's scope. Missing raw measurement artifacts and repeat ranges remain tracked by #4842. - Merge master through `e8c5d800a` in `32c6394b7`. Resolve the CTT log conflict using the updated Mantis states and OPC answers, retaining historical framing and re-checks for C28/C32/C43. - Address the latest naming/index feedback in `adb5bf693`: rename the guides to `docs/WotCon.md` and `docs/WotNodeSetConversion.md`; move the provider and DataType-declaration contracts into the conversion guide and remove `docs/WoT.md`. Rename `samples/DI` to `samples/Di` and `samples/Isa95` to `samples/ISA95`. Add content-index READMEs to Di, FluentApi, ISA95, Lds and PubSub; update solution entries, project references, Docker/CI paths, test fixture paths and documentation links with exact casing. **WoT guide scope.** This branch retains the detailed conversion guide that #4758 had replaced with an anchor stub. Conversion limits, verified document sets, preservation rules and provider ownership now live together in `WotNodeSetConversion.md`; binding/runtime guidance remains in `WotBindings.md` and `WotCon.md`. The design-rationale/test-ledger prose was shortened, the oversized argument-table cell moved into its section, and existing anchors preserved. **SDK policy is a separate, explicit user-directed change.** `global.json` sets a stable minimum of `10.0.400`, `rollForward: latestMajor`, and `allowPrerelease: false`. Newer major SDKs are permitted; CI's explicit SDK pins are unchanged. README, GettingStarted, DeveloperGuide and Recycling instructions reflect the possible analyzer differences. The image-contract regression fix accepts compatible stable SDK images instead of requiring exact equality with the floor. The latest four rename/index threads are resolved after publication. Three older threads remain open: universal obsolete-removal timing, unconditional nonce-strength wording, and a blanket Vision NativeAOT claim. Existing implementation/evidence constraints are explained in their inline replies. The two-level TOCs remain as requested. ## Validation - `git diff --check` and staged diff checks: passed. The untouched upstream AutoID NodeSet retains its provenance bytes, including two existing license-header trailing spaces. - `.\.azurepipelines\validate-migration-plugin.ps1`: passed; 15 bundled migration documents and manifests synchronized. - Documentation/path validation: **101** documents retain two rendered TOC levels (**2,228** entries), with idempotent formatting. **52** new relative links and their anchors passed exact-case checks. No tracked references to the old guide/sample paths remain. Both relocated provider-contract sections are preserved in the destination. - `dotnet sln UA.slnx list`: passed; shows the renamed Di/ISA95 projects and the existing FluentApi/Lds/PubSub projects. Updated solution and pump ProjectReference paths also passed exact-case existence checks. - Latest focused commands, run from the repository root: ```powershell # Passed: 61 channel send-order and reconnect tests. dotnet test tests\Opc.Ua.Core.Tests\Opc.Ua.Core.Tests.csproj -p:CustomTestTarget=net10.0 --filter 'FullyQualifiedName~UaSCBinaryChannelSendOrderTests|FullyQualifiedName~TcpReconnectKeyAgreementTests' --verbosity minimal # Passed: 5 pump datasheet tests; builds the renamed pump sample. dotnet test tests\Opc.Ua.Di.Tests\Opc.Ua.Di.Tests.csproj -p:CustomTestTarget=net10.0 --filter 'FullyQualifiedName~PumpDatasheetConformanceTests' --verbosity minimal # Passed: 4 repository NodeSet path/round-trip tests, including the moved pump models. dotnet test tests\Opc.Ua.Types.Tests\Opc.Ua.Types.Tests.csproj -p:CustomTestTarget=net10.0 --filter 'FullyQualifiedName~RepositorySourceSurvivesSerializedLinkedPartitionsAsync' --verbosity minimal # Passed: build, zero warnings/errors. dotnet build samples\ISA95\MinimalIsa95Server\MinimalIsa95Server.csproj -p:CustomTestTarget=net10.0 -f net10.0 --verbosity minimal # Passed: dependent sample-test project build, zero warnings/errors. dotnet build tests\Opc.Ua.WotCon.Samples.Tests\Opc.Ua.WotCon.Samples.Tests.csproj -p:CustomTestTarget=net10.0 -f net10.0 --verbosity minimal ``` Earlier focused integration checks passed 2,620 tests across AutoID, event queues/scheduling, source generation, MCP/package profiles and WoT. Both reviewed Mermaid diagrams rendered locally without network access. These checks are not a full solution run. The full solution has **not** been rerun for this review. Earlier `dotnet test UA.slnx -p:CustomTestTarget=net10.0 --verbosity quiet` did not pass: three AOT projects rejected VSTest and 20 Vision tests failed during graphics initialization with `OutOfMemoryException`. Remaining long-running tests were stopped at the user's request. A focused Vision rerun passed 558 tests and reproduced those 20 failures. The earlier `dotnet test UA.slnx -p:CustomTestTarget=net48 --verbosity quiet` was blocked by the former SDK pin and was not retried after the policy change. The user approved proceeding with those limitations documented; current remote CI is not claimed green. ## Related Issues - Follow-up #4842 tracks the requested 2.0.2+ benchmark/tuning and diagnostic-tool documentation refresh. #4841 supplies documentation and earlier results, not all newly requested measurements. - #4758 explains the conversion guide's earlier consolidation; the current provider contracts are now consolidated into `WotNodeSetConversion.md`. - #4839 supplies the reviewed API corrections; #4843 supplies the updated CTT issue record. - The original prose cleanup and SDK policy were user-requested without a source issue. No new runtime architecture is introduced by these documentation edits. ## Checklist _Put an `x` in the boxes that apply. You can complete these step by step after opening the PR._ - [ ] I have signed the [CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf) and read the [CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md) doc. - [ ] I have added tests that prove my fix is effective or that my feature works and increased code coverage. - [x] I have added all necessary documentation. - [ ] I have verified that my changes do not introduce (new) build or analyzer warnings. - [ ] I ran **all** tests locally using the **UA.slnx** solution against at least .net **framework** and .net **10**, and all passed. - [ ] I fixed **all** failing and flaky tests in the CI pipelines and **all** CodeQL warnings. - [ ] I have addressed **all** PR feedback received. --------- Co-authored-by: Roman Ettlinger <romanett98@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
OPC UA Model Design File Schema Documentation
Overview
The UA Model Design Schema is an XML authoring format for OPC UA types and instances. The model compiler and source generator use it to generate code and documentation and validate model consistency.
The schema allows modellers to:
- Define Types (ObjectType, VariableType, DataType, ReferenceType)
- Define Instances (Object, Variable, Method, Property)
- Organize entities within Namespaces
- Manage Permissions and Access Restrictions
- Create References between nodes
- Specify Default Values and Parameters
Note: This schema is not part of the official OPC UA specification. The official definition of nodes and references is in the form of .Nodeset2.xml whose schema is defined in OPC UA Part 6 - Annex F. This code is used internally to convert .Nodeset2.xml files to this schema format.
Table of Contents
Document Structure
A valid ModelDesign XML document must:
- Start with a
<ModelDesign>root element - Include a
TargetNamespaceattribute (required) - Optionally define
<Namespaces>and<PermissionSets> - Contain zero or more type and instance declarations
- Optionally include
<Extensions>for custom metadata
Example Model Structure
<?xml version="1.0" encoding="utf-8"?>
<ModelDesign
TargetNamespace="http://example.com/MyModel"
TargetVersion="1.0"
TargetXmlNamespace="http://example.com/MyModel/Types.xsd"
DefaultLocale="en">
<Namespaces>
<Namespace Name="MyNamespace"
Prefix="Example.MyModel">
http://example.com/MyModel
</Namespace>
</Namespaces>
<ObjectType SymbolicName="MyObjectType">
<!-- Type definition -->
</ObjectType>
</ModelDesign>
{
"TargetNamespace": "http://example.com/MyModel",
"TargetVersion": "1.0",
"TargetXmlNamespace": "http://example.com/MyModel/Types.xsd",
"DefaultLocale": "en",
"Namespaces": [
{
"Name": "MyNamespace",
"Prefix": "Example.MyModel",
"Content": "http://example.com/MyModel"
}
],
"ObjectTypes": [
{
"SymbolicName": "MyObjectType"
}
]
}
Core Components
1. Root Element: ModelDesign
The <ModelDesign> element is the container for all model definitions.
Attributes:
TargetNamespace(required) - The URI identifying the namespaceTargetVersion(optional) - Version of the modelTargetPublicationDate(optional) - Publication date (ISO 8601)TargetXmlNamespace(optional) - XML namespace URI (if different from TargetNamespace)DefaultLocale(optional, default: "en") - Default language locale
See also: Namespaces, Permission Management, Extensions
2. Namespace Organization
Namespaces organize OPC UA entities and create numeric indices for browse paths.
<Namespaces>
<Namespace Name="Core"
Prefix="Opc.Ua"
InternalPrefix="Opc.Ua.Server"
XmlNamespace="http://opcfoundation.org/UA/2008/02/Types.xsd"
FilePath="Opc.Ua.Types.xml">
http://opcfoundation.org/UA/
</Namespace>
</Namespaces>
{
"Namespaces": [
{
"Name": "Core",
"Prefix": "Opc.Ua",
"InternalPrefix": "Opc.Ua.Server",
"XmlNamespace": "http://opcfoundation.org/UA/2008/02/Types.xsd",
"FilePath": "Opc.Ua.Types.xml",
"Content": "http://opcfoundation.org/UA/"
}
]
}
Namespace Attributes:
Name- Symbolic identifier for the namespacePrefix- C# namespace for generated classesInternalPrefix- C# namespace for server-only typesXmlNamespace- XML namespace URI (if different from content)XmlPrefix- XML namespace prefixFilePath- Path to separate design fileVersion- Namespace versionPublicationDate- Publication date
3. Permission Management
Permission Management controls access and security for nodes.
Permission Sets (Global)
Define reusable permission configurations at the model level.
<PermissionSets>
<PermissionSet Name="AdminPermissions">
<RolePermission Role="Administrator">
<Permission>All</Permission>
</RolePermission>
<RolePermission Role="Guest">
<Permission>Browse</Permission>
<Permission>Read</Permission>
</RolePermission>
</PermissionSet>
</PermissionSets>
{
"PermissionSets": [
{
"Name": "AdminPermissions",
"RolePermissions": [
{
"Role": "Administrator",
"Permissions": ["All"]
},
{
"Role": "Guest",
"Permissions": ["Browse", "Read"]
}
]
}
]
}
Role-Based Permissions
Each node can have role-specific permissions. Available permissions include:
- Browse - Browse the node
- Read - Read the node value
- Write - Write the node value
- ReadHistory - Read node history
- InsertHistory, ModifyHistory, DeleteHistory
- ReceiveEvents - Subscribe to node events
- Call - Invoke methods
- AddReference, RemoveReference
- DeleteNode, AddNode
- All, AllRead, None
See also: Role-Based Access, Access Restrictions
Type System
The schema defines four main type categories through a type hierarchy:
graph TD
A["NodeDesign<br/>(Base)"] --> B["TypeDesign"]
A --> C["InstanceDesign"]
B --> B1["ObjectTypeDesign"]
B --> B2["VariableTypeDesign"]
B --> B3["DataTypeDesign"]
B --> B4["ReferenceTypeDesign"]
C --> C1["ObjectDesign"]
C --> C2["VariableDesign"]
C --> C3["MethodDesign"]
C --> C4["ViewDesign"]
C2 --> C2a["PropertyDesign"]
B1 --> B1a["EncodingDesign"]
C2 --> C2b["DictionaryDesign"]
3.1 Type Designs (Inherits from TypeDesign)
Type designs define the structure and behavior of types in the information model.
ObjectTypeDesign
Defines the structure of objects in the information model. See Instance Designs for related ObjectDesign.
<ObjectType SymbolicName="MyObjectType"
BaseType="ua:BaseObjectType"
IsAbstract="false"
SupportsEvents="true">
<DisplayName>My Custom Object</DisplayName>
<Description>Describes an instance of MyObjectType</Description>
<Children>
<Variable SymbolicName="Status" TypeDefinition="ua:BaseVariableType" />
<Method SymbolicName="Initialize" />
</Children>
</ObjectType>
{
"ObjectType": {
"SymbolicName": "MyObjectType",
"BaseType": "ua:BaseObjectType",
"IsAbstract": false,
"SupportsEvents": true,
"DisplayName": "My Custom Object",
"Description": "Describes an instance of MyObjectType",
"Children": [
{
"Variable": {
"SymbolicName": "Status",
"TypeDefinition": "ua:BaseVariableType"
}
},
{
"Method": {
"SymbolicName": "Initialize"
}
}
]
}
}
Key Attributes:
BaseType- Parent type (default: BaseObjectType)IsAbstract- Cannot instantiate if trueSupportsEvents- Generates eventsNoClassGeneration- Skip code generation
VariableTypeDesign
Defines the structure of variables in the information model. See Instance Designs for related VariableDesign.
<VariableType SymbolicName="TemperatureType"
DataType="xs:double"
ValueRank="Scalar"
AccessLevel="ReadWrite">
<DefaultValue>
<Double>20.5</Double>
</DefaultValue>
</VariableType>
{
"VariableType": {
"SymbolicName": "TemperatureType",
"DataType": "xs:double",
"ValueRank": "Scalar",
"AccessLevel": "ReadWrite",
"DefaultValue": {
"Double": 20.5
}
}
}
Key Attributes:
DataType- The data type of the variableValueRank- Scalar, Array, ScalarOrArray, OneOrMoreDimensions, ScalarOrOneDimension, AnyArrayDimensions- Dimensions specificationAccessLevel- Read, Write, ReadWrite, HistoryRead, HistoryWrite, HistoryReadWriteMinimumSamplingInterval- Sampling rate in millisecondsHistorizing- Supports historical dataExposesItsChildren- Children are exposed in address space
DataTypeDesign
Defines the structure of data types (complex types). See Complex Types for detailed examples.
<DataType SymbolicName="MyStructure"
IsAbstract="false"
IsOptionSet="false"
IsUnion="false">
<Fields>
<Field Name="Field1" DataType="xs:int" />
<Field Name="Field2" DataType="xs:string" IsOptional="true" />
</Fields>
<Encodings>
<Encoding SymbolicName="MyStructureEncoding">
<!-- Encoding specification -->
</Encoding>
</Encodings>
</DataType>
{
"DataType": {
"SymbolicName": "MyStructure",
"IsAbstract": false,
"IsOptionSet": false,
"IsUnion": false,
"Fields": [
{
"Name": "Field1",
"DataType": "xs:int"
},
{
"Name": "Field2",
"DataType": "xs:string",
"IsOptional": true
}
],
"Encodings": [
{
"SymbolicName": "MyStructureEncoding"
}
]
}
}
Key Attributes:
IsOptionSet- Structure is an option set (bitmask)IsUnion- Structure is a union typeNoArraysAllowed- Instances cannot be arraysForceEnumValues- Force numeric values for enumsNoEncodings- Skip encoding generation
Special Cases:
- OptionSet: Represents a set of flags combined with bitwise operations
- Union: Only one field is active at a time
See also: DataType with Fields, DataType with Encodings
ReferenceTypeDesign
Defines typed References between nodes.
<ReferenceType SymbolicName="MyReference"
BaseType="ua:References"
Symmetric="false">
<InverseName>IsReferencedBy</InverseName>
</ReferenceType>
{
"ReferenceType": {
"SymbolicName": "MyReference",
"BaseType": "ua:References",
"Symmetric": false,
"InverseName": "IsReferencedBy"
}
}
Attributes:
Symmetric- Same reference type applies in both directions
3.2 Instance Designs (Inherits from InstanceDesign)
Instance designs represent actual instances of types in the OPC UA address space. See Type Designs for the corresponding type definitions.
ObjectDesign
Represents an object instance in the address space. Instances of ObjectTypeDesign.
<Object SymbolicName="MyObject"
TypeDefinition="MyObjectType"
ModellingRule="Mandatory"
SupportsEvents="true">
<DisplayName>My Object Instance</DisplayName>
<Children>
<Variable SymbolicName="Status" />
</Children>
</Object>
{
"Object": {
"SymbolicName": "MyObject",
"TypeDefinition": "MyObjectType",
"ModellingRule": "Mandatory",
"SupportsEvents": true,
"DisplayName": "My Object Instance",
"Children": [
{
"Variable": {
"SymbolicName": "Status"
}
}
]
}
}
VariableDesign
Represents a variable instance in the address space. Instances of VariableTypeDesign.
<Variable SymbolicName="Temperature"
TypeDefinition="TemperatureType"
DataType="xs:double"
AccessLevel="Read"
ModellingRule="Mandatory">
<DefaultValue>
<Double>20.0</Double>
</DefaultValue>
</Variable>
{
"Variable": {
"SymbolicName": "Temperature",
"TypeDefinition": "TemperatureType",
"DataType": "xs:double",
"AccessLevel": "Read",
"ModellingRule": "Mandatory",
"DefaultValue": {
"Double": 20.0
}
}
}
PropertyDesign
A specialized VariableDesign used for node properties.
<Property SymbolicName="SerialNumber"
DataType="xs:string"
AccessLevel="Read"
ModellingRule="Mandatory" />
{
"Property": {
"SymbolicName": "SerialNumber",
"DataType": "xs:string",
"AccessLevel": "Read",
"ModellingRule": "Mandatory"
}
}
MethodDesign
Represents a method (callable operation).
<Method SymbolicName="Initialize"
ModellingRule="Mandatory"
NonExecutable="false">
<InputArguments>
<Argument Name="Parameter1" DataType="xs:int" />
</InputArguments>
<OutputArguments>
<Argument Name="Result" DataType="xs:string" />
</OutputArguments>
</Method>
{
"Method": {
"SymbolicName": "Initialize",
"ModellingRule": "Mandatory",
"NonExecutable": false,
"InputArguments": [
{
"Name": "Parameter1",
"DataType": "xs:int"
}
],
"OutputArguments": [
{
"Name": "Result",
"DataType": "xs:string"
}
]
}
}
ViewDesign
Represents a view in the address space.
<View SymbolicName="MyView"
ContainsNoLoops="true"
SupportsEvents="false" />
{
"View": {
"SymbolicName": "MyView",
"ContainsNoLoops": true,
"SupportsEvents": false
}
}
Common Patterns
Node Design Pattern
All nodes share common attributes and child elements:
graph LR
A["NodeDesign"] --> B["Attributes"]
A --> C["Child Elements"]
B --> B1["SymbolicName"]
B --> B2["SymbolicId"]
B --> B3["NumericId/StringId"]
B --> B4["WriteAccess"]
B --> B5["ReleaseStatus"]
B --> B6["Purpose"]
C --> C1["BrowseName"]
C --> C2["DisplayName"]
C --> C3["Description"]
C --> C4["Children"]
C --> C5["References"]
C --> C6["RolePermissions"]
C --> C7["AccessRestrictions"]
Key Attributes (on all nodes):
SymbolicName- Local identifier (required)SymbolicId- Globally unique identifier (auto-generated if not specified)NumericId- UA numeric node IDStringId- UA string node ID (alternative to NumericId)IsDeclaration- Node is declared elsewhere (no code generation)WriteAccess- Bitmask of writable attributesPartNo- Which part of specification defines itCategory- Comma-separated categoriesReleaseStatus- See Release StatusPurpose- See PurposeIsDynamic- Node value may change during runtime
See also: Instance Design Pattern, Validation Indicators
Instance Design Pattern
Instances (Object, Variable, Method) inherit from InstanceDesign:
<Object SymbolicName="MyInstance"
Declaration="ua:BaseObjectType"
TypeDefinition="MyObjectType"
ModellingRule="Mandatory"
MinCardinality="0"
MaxCardinality="0"
PreserveDefaultAttributes="false"
DesignToolOnly="false">
<!-- Content -->
</Object>
{
"Object": {
"SymbolicName": "MyInstance",
"Declaration": "ua:BaseObjectType",
"TypeDefinition": "MyObjectType",
"ModellingRule": "Mandatory",
"MinCardinality": 0,
"MaxCardinality": 0,
"PreserveDefaultAttributes": false,
"DesignToolOnly": false
}
}
Modelling Rules:
None- Not constrainedMandatory- Must be present in instancesOptional- May be presentMandatoryShared- Shared mandatory instanceOptionalPlaceholder- Optional placeholderMandatoryPlaceholder- Mandatory placeholderExposesItsArray- Array elements exposed separatelyCardinalityRestriction- Cardinality is restricted
See also: Node Design Pattern
Reference Pattern
References create semantic relationships between nodes. See ReferenceTypeDesign for type definitions.
<References>
<Reference IsInverse="false" IsOneWay="false">
<ReferenceType>ua:HasComponent</ReferenceType>
<TargetId>MyTargetNode</TargetId>
</Reference>
</References>
{
"References": [
{
"IsInverse": false,
"IsOneWay": false,
"ReferenceType": "ua:HasComponent",
"TargetId": "MyTargetNode"
}
]
}
Attributes:
IsInverse- Reference direction is invertedIsOneWay- Only forward reference exists
Access Control
Access Restrictions
Nodes can specify security requirements:
<AccessRestrictions>SigningRequired</AccessRestrictions>
<AccessRestrictions>EncryptionRequired</AccessRestrictions>
{
"AccessRestrictions": [
"SigningRequired",
"EncryptionRequired"
]
}
Available Restrictions:
SigningRequired- Messages must be signedEncryptionRequired- Messages must be encryptedSessionRequired- Active session requiredSessionWithSigningRequired- Session + signingSessionWithEncryptionRequired- Session + encryption- (AndApplyToBrowse variants) - Restrictions apply to browse operations
See also: Role-Based Access, Permission Management
Role-Based Access
Assign permissions to roles using RolePermissions. See Role-Based Permissions for available permission types.
<RolePermissions Name="MyPermissions" DoNotInheirit="false">
<RolePermission Role="Administrator">
<Permission>All</Permission>
</RolePermission>
<RolePermission Role="User">
<Permission>Browse</Permission>
<Permission>Read</Permission>
</RolePermission>
</RolePermissions>
{
"RolePermissions": {
"Name": "MyPermissions",
"DoNotInherit": false,
"RolePermissions": [
{
"Role": "Administrator",
"Permissions": ["All"]
},
{
"Role": "User",
"Permissions": ["Browse", "Read"]
}
]
}
}
See also: Permission Management, Access Restrictions
Complex Types
DataType with Fields
Fields define the structure of complex DataType definitions.
<DataType SymbolicName="UserIdentity">
<Fields>
<Field Name="UserId" DataType="xs:int" Identifier="1" />
<Field Name="UserName" DataType="xs:string" Identifier="2" />
<Field Name="Email" DataType="xs:string" Identifier="3" IsOptional="true" />
<Field Name="Permissions" DataType="xs:unsignedInt" BitMask="Permissions" />
</Fields>
</DataType>
{
"DataType": {
"SymbolicName": "UserIdentity",
"Fields": [
{
"Name": "UserId",
"DataType": "xs:int",
"Identifier": 1
},
{
"Name": "UserName",
"DataType": "xs:string",
"Identifier": 2
},
{
"Name": "Email",
"DataType": "xs:string",
"Identifier": 3,
"IsOptional": true
},
{
"Name": "Permissions",
"DataType": "xs:unsignedInt",
"BitMask": "Permissions"
}
]
}
}
Field Attributes:
Name- Field identifierDataType- Type of the fieldIdentifier- Unique numeric identifierValueRank- Scalar or ArrayArrayDimensions- Dimensions if arrayBitMask- Named bitmask for flag fieldsAllowSubTypes- Subtypes allowedIsOptional- Field is optional
See also: DataType with Encodings
DataType with Encodings
Encodings define how DataType instances are serialized.
<DataType SymbolicName="MyStructure">
<Encodings>
<Encoding SymbolicName="MyStructureXml"
TypeDefinition="ua:DataTypeEncodingType">
<DisplayName>XML Encoding</DisplayName>
</Encoding>
<Encoding SymbolicName="MyStructureBinary"
TypeDefinition="ua:DataTypeEncodingType">
<DisplayName>Binary Encoding</DisplayName>
</Encoding>
</Encodings>
</DataType>
{
"DataType": {
"SymbolicName": "MyStructure",
"Encodings": [
{
"SymbolicName": "MyStructureXml",
"TypeDefinition": "ua:DataTypeEncodingType",
"DisplayName": "XML Encoding"
},
{
"SymbolicName": "MyStructureBinary",
"TypeDefinition": "ua:DataTypeEncodingType",
"DisplayName": "Binary Encoding"
}
]
}
}
See also: DataType with Fields
Hierarchical Structure
Complete Example with Hierarchy
Demonstrates how ObjectType, Property, Variable, and Method definitions create a complete hierarchy.
<ObjectType SymbolicName="DeviceType">
<DisplayName>Device</DisplayName>
<Children>
<Property SymbolicName="SerialNumber" DataType="xs:string" />
<Variable SymbolicName="Status" DataType="xs:string" />
<Method SymbolicName="Start" />
<Method SymbolicName="Stop" />
<Object SymbolicName="Parameters" TypeDefinition="ParameterGroupType">
<Children>
<Property SymbolicName="Timeout" DataType="xs:int" />
<Property SymbolicName="RetryCount" DataType="xs:int" />
</Children>
</Object>
</Children>
</ObjectType>
{
"ObjectType": {
"SymbolicName": "DeviceType",
"DisplayName": "Device",
"Children": [
{
"Property": {
"SymbolicName": "SerialNumber",
"DataType": "xs:string"
}
},
{
"Variable": {
"SymbolicName": "Status",
"DataType": "xs:string"
}
},
{
"Method": {
"SymbolicName": "Start"
}
},
{
"Method": {
"SymbolicName": "Stop"
}
},
{
"Object": {
"SymbolicName": "Parameters",
"TypeDefinition": "ParameterGroupType",
"Children": [
{
"Property": {
"SymbolicName": "Timeout",
"DataType": "xs:int"
}
},
{
"Property": {
"SymbolicName": "RetryCount",
"DataType": "xs:int"
}
}
]
}
}
]
}
}
Processing Workflow
graph TD
A["XML Design File"] --> B["Validator"]
B --> C["Assigns Numeric IDs"]
B --> D["Generates BrowseNames"]
B --> E["Generates DisplayNames"]
B --> F["Generates Descriptions"]
C --> G["Code Generator"]
D --> G
E --> G
F --> G
G --> H["Generated Code"]
G --> I["Generated Documentation"]
The workflow:
- Design - Model is authored in XML
- Validation - Validator checks consistency (see Schema Validation)
- Augmentation - Auto-generate missing attributes
- Generation - Create code and documentation
- Output - Type classes, instances, constants
Best Practices
Naming Conventions
- SymbolicName: Use PascalCase (e.g.,
TemperatureType,MyObject) - BrowseName: Same as SymbolicName (auto-generated)
- DisplayName: Human-readable label
- ClassName: For types, remove 'Type' suffix (auto-generated)
Type Hierarchy
<!-- ✓ Good: Proper inheritance -->
<VariableType SymbolicName="AnalogItemType"
BaseType="ua:VariableType" />
<VariableType SymbolicName="TemperatureType"
BaseType="AnalogItemType" />
<!-- ✗ Avoid: Unnecessary abstraction levels -->
{
"comment": "Good: Proper inheritance",
"VariableTypes": [
{
"SymbolicName": "AnalogItemType",
"BaseType": "ua:VariableType"
},
{
"SymbolicName": "TemperatureType",
"BaseType": "AnalogItemType"
}
]
}
See also: Type System
Validation Indicators
- Always specify
SymbolicName(see Node Design Pattern) - Use
IsDeclaration="true"for external references - Include descriptions for public types
- Assign unique
NumericIdvalues - Use
ModellingRuleconsistently (see Instance Design Pattern)
Release Status and Purpose
Release Status
Controls visibility and stability of nodes. Used in Node Design Pattern:
<ObjectType SymbolicName="ExperimentalType"
ReleaseStatus="Draft">
<!-- Type under development -->
</ObjectType>
<ObjectType SymbolicName="StableType"
ReleaseStatus="Released">
<!-- Production-ready type -->
</ObjectType>
{
"ObjectTypes": [
{
"SymbolicName": "ExperimentalType",
"ReleaseStatus": "Draft"
},
{
"SymbolicName": "StableType",
"ReleaseStatus": "Released"
}
]
}
Purpose
Indicates intended usage. Used in Node Design Pattern:
<DataType SymbolicName="RequestType" Purpose="ServicesOnly">
<!-- Used only in service definitions -->
</DataType>
<DataType SymbolicName="TempStruct" Purpose="Testing">
<!-- Used for testing only -->
</DataType>
{
"DataTypes": [
{
"SymbolicName": "RequestType",
"Purpose": "ServicesOnly"
},
{
"SymbolicName": "TempStruct",
"Purpose": "Testing"
}
]
}
Schema Validation
The validator performs these checks on ModelDesign documents:
✓ Consistency - All References are valid
✓ Uniqueness - No duplicate SymbolicIds
✓ Completeness - All required attributes present
✓ Type Safety - DataTypes match References
✓ Circular References - No invalid cycles
Extensions
Custom Extensions can be added for tool-specific metadata:
<ModelDesign TargetNamespace="..." >
<!-- Standard content -->
<Extensions>
<Extension>
<CustomMetadata>
<Property Name="Author">John Doe</Property>
<Property Name="Version">1.0</Property>
</CustomMetadata>
</Extension>
</Extensions>
</ModelDesign>
{
"TargetNamespace": "...",
"Extensions": [
{
"CustomMetadata": {
"Author": "John Doe",
"Version": "1.0"
}
}
]
}
See also: Root Element: ModelDesign