Files
Marc Schier 4756e7c245 DI (OPC 10000-100) with samples (Pump, SW Update), fluent API gap closures and model dependency implementation (#3808)
This PR implements the **OPC UA Device Integration (DI, OPC 10000-100)**
companion-spec library trio (`Opc.Ua.Di` / `Opc.Ua.Di.Server` /
`Opc.Ua.Di.Client`) plus a worked example
(`Applications/MinimalPumpServer`) demonstrating the OPC 40223 Pumps
companion specification end-to-end with full simulation. It also closes
11 fluent-API gaps in `Opc.Ua.Server.Fluent`, three source-generator
bugs, integrates the DI layer into the unified `services.AddOpcUa()`
Microsoft.Extensions DI hosting pattern, and adds 250+ new tests.

**Worked example — `Applications/MinimalPumpServer/`**
- AOT-compatible console host using `Host.CreateApplicationBuilder` +
`AddOpcUa()`.
- `PumpNodeManager` inherits from `DiNodeManager`; multi-namespace (DI +
Machinery + Pumps) via runtime NodeSet2 loading and
`ModelLoaderBuilder`.
- Demonstrates declarative second-pump creation via
`.ConfigureDevicesFor<PumpNodeManager>(...)` and software-package
seeding from the same configurator.
- Full simulation: pressure, temperatures, power, flow, efficiency,
level, cavitation/overheat fault injection, alarm setup, NAMUR-style
supervision.

**Documentation**
- `Docs/Opc.Ua.Di/` — README, DeviceBuilder, Hosting, LockService,
SoftwareUpdate, ClientHelpers (6 new developer guides).
- `Docs/Opc.Ua.Di/ComplianceMatrix.md` — every DI declaration mapped to
In-v1 / Generated / Deferred / Excluded.
- `Docs/CompanionSpecLibraries.md` — packaging guide for new
companion-spec libraries.
- `Docs/FluentApiGaps.md` — historical record of G1–G11.
- `Docs/SourceGeneratedNodeManagers.md` updated for richer node
managers.
- `Docs/plans/StateMachineBuilder.md` — deferred state-machine builder
design.
2026-06-04 05:57:57 +02:00

1379 lines
66 KiB
XML

<?xml version="1.0" encoding="utf-8" ?>
<!--
* Copyright (c) 2005-2024 The OPC Foundation, Inc. All rights reserved.
*
* OPC Foundation MIT License 1.00
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* The complete license agreement can be found here:
* http://opcfoundation.org/License/MIT/1.00/
-->
<ModelDesign
xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:OpcUa="http://opcfoundation.org/UA/"
xmlns:DI="http://opcfoundation.org/UA/DI/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
TargetNamespace="http://opcfoundation.org/UA/DI/"
TargetXmlNamespace="http://opcfoundation.org/UA/DI/"
TargetVersion="1.05.0"
TargetPublicationDate="2025-11-15T00:00:00Z"
xmlns="http://opcfoundation.org/UA/ModelDesign.xsd">
<Namespaces>
<Namespace Name="OpcUaDi" Prefix="Opc.Ua.Di" XmlNamespace="http://opcfoundation.org/UA/DI/Types.xsd" XmlPrefix="DI">http://opcfoundation.org/UA/DI/</Namespace>
<Namespace Name="OpcUa" Prefix="Opc.Ua" InternalPrefix="Opc.Ua.Server" Version="1.05.04" PublicationDate="2025-01-08T00:00:00Z" XmlNamespace="http://opcfoundation.org/UA/2008/02/Types.xsd" XmlPrefix="OpcUa">http://opcfoundation.org/UA/</Namespace>
</Namespaces>
<Object SymbolicName="DI:OPCUADINamespaceMetadata" TypeDefinition="OpcUa:NamespaceMetadataType">
<BrowseName>http://opcfoundation.org/UA/DI/</BrowseName>
<Children>
<Property SymbolicName="OpcUa:NamespaceUri" DataType="OpcUa:String">
<DefaultValue>
<uax:String>http://opcfoundation.org/UA/DI/</uax:String>
</DefaultValue>
</Property>
<Property SymbolicName="OpcUa:NamespaceVersion" DataType="OpcUa:String">
<DefaultValue>
<uax:String>1.05.0</uax:String>
</DefaultValue>
</Property>
<Property SymbolicName="OpcUa:ModelVersion" DataType="OpcUa:SemanticVersionString">
<DefaultValue>
<uax:String>1.5.0</uax:String>
</DefaultValue>
</Property>
<Property SymbolicName="OpcUa:NamespacePublicationDate" DataType="OpcUa:DateTime">
<DefaultValue>
<uax:DateTime>2025-11-15</uax:DateTime>
</DefaultValue>
</Property>
<Property SymbolicName="OpcUa:IsNamespaceSubset" DataType="OpcUa:Boolean">
<DefaultValue>
<uax:Boolean>false</uax:Boolean>
</DefaultValue>
</Property>
<Property SymbolicName="OpcUa:StaticNodeIdTypes" DataType="OpcUa:IdType" ValueRank="Array">
<DefaultValue>
<uax:ListOfInt32>
<uax:Int32>0</uax:Int32>
</uax:ListOfInt32>
</DefaultValue>
</Property>
<Property SymbolicName="OpcUa:StaticNumericNodeIdRange" DataType="OpcUa:NumericRange" ValueRank="Array"/>
<Property SymbolicName="OpcUa:StaticStringNodeIdPattern" DataType="OpcUa:String">
<DefaultValue>
<uax:String></uax:String>
</DefaultValue>
</Property>
<Property SymbolicName="OpcUa:DefaultRolePermissions" ModellingRule="Mandatory" />
<Property SymbolicName="OpcUa:DefaultUserRolePermissions" ModellingRule="Mandatory" />
<Property SymbolicName="OpcUa:DefaultAccessRestrictions" ModellingRule="Mandatory" />
</Children>
<References>
<Reference IsInverse="true">
<ReferenceType>OpcUa:HasComponent</ReferenceType>
<TargetId>OpcUa:Server_Namespaces</TargetId>
</Reference>
</References>
</Object>
<ReferenceType SymbolicName="DI:ConnectsTo" BaseType="OpcUa:NonHierarchicalReferences" Symmetric="true">
</ReferenceType>
<ReferenceType SymbolicName="DI:ConnectsToParent" BaseType="DI:ConnectsTo" Symmetric="true">
</ReferenceType>
<ReferenceType SymbolicName="DI:IsOnline" BaseType="OpcUa:Aggregates">
<InverseName>OnlineOf</InverseName>
</ReferenceType>
<ReferenceType SymbolicName="DI:UpdateParent" BaseType="OpcUa:HierarchicalReferences">
<InverseName>UpdateChild</InverseName>
</ReferenceType>
<ReferenceType SymbolicName="DI:CanUpdate" BaseType="OpcUa:HierarchicalReferences">
<InverseName>CanBeUpdatedBy</InverseName>
</ReferenceType>
<Object SymbolicName="DI:DeviceSet" TypeDefinition="OpcUa:BaseObjectType">
<References>
<Reference IsInverse="true">
<ReferenceType>OpcUa:Organizes</ReferenceType>
<TargetId>OpcUa:ObjectsFolder</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:DeviceFeatures" TypeDefinition="OpcUa:BaseObjectType">
<References>
<Reference IsInverse="true">
<ReferenceType>OpcUa:Organizes</ReferenceType>
<TargetId>DI:DeviceSet</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:NetworkSet" TypeDefinition="OpcUa:BaseObjectType">
<References>
<Reference IsInverse="true">
<ReferenceType>OpcUa:Organizes</ReferenceType>
<TargetId>OpcUa:ObjectsFolder</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:DeviceTopology" TypeDefinition="OpcUa:BaseObjectType">
<Children>
<Property SymbolicName="DI:OnlineAccess" DataType="OpcUa:Boolean">
</Property>
</Children>
<References>
<Reference IsInverse="true">
<ReferenceType>OpcUa:Organizes</ReferenceType>
<TargetId>OpcUa:ObjectsFolder</TargetId>
</Reference>
</References>
</Object>
<ObjectType SymbolicName="DI:TopologyElementType" BaseType="OpcUa:BaseObjectType" IsAbstract="true">
<Children>
<Object SymbolicName="DI:ParameterSet" TypeDefinition="OpcUa:BaseObjectType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:ParameterIdentifier" TypeDefinition="OpcUa:BaseDataVariableType" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ParameterIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
<Object SymbolicName="DI:MethodSet" TypeDefinition="OpcUa:BaseObjectType" ModellingRule="Optional">
</Object>
<Object SymbolicName="DI:GroupIdentifier" TypeDefinition="DI:FunctionalGroupType" ModellingRule="OptionalPlaceholder">
<BrowseName>&lt;GroupIdentifier&gt;</BrowseName>
</Object>
<Object SymbolicName="DI:Identification" TypeDefinition="DI:FunctionalGroupType" ModellingRule="Optional">
</Object>
<Object SymbolicName="DI:Lock" TypeDefinition="DI:LockingServicesType" ModellingRule="Optional">
</Object>
</Children>
</ObjectType>
<ObjectType SymbolicName="DI:IVendorNameplateType" BaseType="OpcUa:BaseInterfaceType" IsAbstract="true">
<Children>
<Property SymbolicName="DI:Manufacturer" DataType="OpcUa:LocalizedText" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ManufacturerUri" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:Model" DataType="OpcUa:LocalizedText" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:HardwareRevision" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:SoftwareRevision" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:DeviceRevision" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ProductCode" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:DeviceManual" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:DeviceClass" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:SerialNumber" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ProductInstanceUri" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:RevisionCounter" DataType="OpcUa:Int32" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:SoftwareReleaseDate" DataType="OpcUa:DateTime" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:PatchIdentifiers" DataType="OpcUa:String" ValueRank="Array" ModellingRule="Optional" />
</Children>
</ObjectType>
<ObjectType SymbolicName="DI:ITagNameplateType" BaseType="OpcUa:BaseInterfaceType" IsAbstract="true">
<Children>
<Property SymbolicName="DI:AssetId" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional">
</Property>
<Property SymbolicName="DI:ComponentName" DataType="OpcUa:LocalizedText" ValueRank="Scalar" ModellingRule="Optional">
</Property>
</Children>
</ObjectType>
<ObjectType SymbolicName="DI:IDeviceHealthType" BaseType="OpcUa:BaseInterfaceType" IsAbstract="true">
<Children>
<Variable SymbolicName="DI:DeviceHealth" DataType="DI:DeviceHealthEnumeration" ValueRank="Scalar" ModellingRule="Optional" />
<Object SymbolicName="DI:DeviceHealthAlarms" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional" />
</Children>
</ObjectType>
<ObjectType SymbolicName="DI:ISupportInfoType" BaseType="OpcUa:BaseInterfaceType" IsAbstract="true">
<Children>
<Object SymbolicName="DI:DeviceTypeImage" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:ImageIdentifier" DataType="OpcUa:Image" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ImageIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
<Object SymbolicName="DI:Documentation" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:DocumentIdentifier" DataType="OpcUa:ByteString" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;DocumentIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
<Object SymbolicName="DI:DocumentationFiles" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Object SymbolicName="DI:DocumentFileId" TypeDefinition="OpcUa:FileType" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;DocumentFileId&gt;</BrowseName>
</Object>
</Children>
</Object>
<Object SymbolicName="DI:ProtocolSupport" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:ProtocolSupportIdentifier" DataType="OpcUa:ByteString" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ProtocolSupportIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
<Object SymbolicName="DI:ImageSet" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:ImageIdentifier" DataType="OpcUa:Image" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ImageIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
</Children>
</ObjectType>
<Method SymbolicName="DI:StartLocationIndicationMethodType">
<InputArguments>
<Argument Name="IndicationDuration" DataType="OpcUa:Duration" />
</InputArguments>
</Method>
<ObjectType SymbolicName="DI:IAssetLocationIndicationType" BaseType="OpcUa:BaseInterfaceType" IsAbstract="true">
<Children>
<Method SymbolicName="DI:StartLocationIndication" TypeDefinition="DI:StartLocationIndicationMethodType" ModellingRule="Mandatory" />
<Method SymbolicName="DI:StopLocationIndication" ModellingRule="Mandatory" />
<Property SymbolicName="DI:IsIndicating" DataType="OpcUa:Boolean" ValueRank="Scalar" ModellingRule="Mandatory" />
<Property SymbolicName="DI:UsedIndicationType" DataType="DI:LocationIndicationType" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:SupportedIndicationTypes" DataType="DI:LocationIndicationType" ValueRank="Scalar" ModellingRule="Optional" />
</Children>
</ObjectType>
<ObjectType SymbolicName="DI:ComponentType" BaseType="DI:TopologyElementType" IsAbstract="true">
<Children>
<Property SymbolicName="DI:Manufacturer" DataType="OpcUa:LocalizedText" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ManufacturerUri" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:Model" DataType="OpcUa:LocalizedText" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:HardwareRevision" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:SoftwareRevision" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:DeviceRevision" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ProductCode" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:DeviceManual" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:DeviceClass" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:SerialNumber" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ProductInstanceUri" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:RevisionCounter" DataType="OpcUa:Int32" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:AssetId" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ComponentName" DataType="OpcUa:LocalizedText" ValueRank="Scalar" ModellingRule="Optional" />
</Children>
<References>
<Reference IsInverse="false">
<ReferenceType>OpcUa:HasInterface</ReferenceType>
<TargetId>DI:IVendorNameplateType</TargetId>
</Reference>
<Reference IsInverse="false">
<ReferenceType>OpcUa:HasInterface</ReferenceType>
<TargetId>DI:ITagNameplateType</TargetId>
</Reference>
</References>
</ObjectType>
<ObjectType SymbolicName="DI:DeviceType" BaseType="DI:ComponentType" IsAbstract="true">
<Children>
<Object SymbolicName="DI:CPIdentifier" TypeDefinition="DI:ConnectionPointType" ModellingRule="OptionalPlaceholder">
<BrowseName>&lt;CPIdentifier&gt;</BrowseName>
</Object>
<Property SymbolicName="DI:SerialNumber" DataType="OpcUa:String" ModellingRule="Mandatory" >
</Property>
<Property SymbolicName="DI:RevisionCounter" DataType="OpcUa:Int32" ModellingRule="Mandatory">
</Property>
<Property SymbolicName="DI:Manufacturer" DataType="OpcUa:LocalizedText" ModellingRule="Mandatory">
</Property>
<Property SymbolicName="DI:Model" DataType="OpcUa:LocalizedText" ModellingRule="Mandatory">
</Property>
<Property SymbolicName="DI:DeviceManual" DataType="OpcUa:String" ModellingRule="Mandatory">
</Property>
<Property SymbolicName="DI:DeviceRevision" DataType="OpcUa:String" ModellingRule="Mandatory">
</Property>
<Property SymbolicName="DI:SoftwareRevision" DataType="OpcUa:String" ModellingRule="Mandatory">
</Property>
<Property SymbolicName="DI:HardwareRevision" DataType="OpcUa:String" ModellingRule="Mandatory">
</Property>
<Property SymbolicName="DI:DeviceClass" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional">
</Property>
<Property SymbolicName="DI:ManufacturerUri" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ProductCode" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Property SymbolicName="DI:ProductInstanceUri" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Optional" />
<Variable SymbolicName="DI:DeviceHealth" DataType="DI:DeviceHealthEnumeration" ValueRank="Scalar" ModellingRule="Optional" />
<Object SymbolicName="DI:DeviceHealthAlarms" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional" />
<Object SymbolicName="DI:DeviceTypeImage" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:ImageIdentifier" DataType="OpcUa:Image" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ImageIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
<Object SymbolicName="DI:Documentation" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:DocumentIdentifier" DataType="OpcUa:ByteString" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;DocumentIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
<Object SymbolicName="DI:ProtocolSupport" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:ProtocolSupportIdentifier" DataType="OpcUa:ByteString" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ProtocolSupportIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
<Object SymbolicName="DI:ImageSet" TypeDefinition="OpcUa:FolderType" ModellingRule="Optional">
<Children>
<Variable SymbolicName="DI:ImageIdentifier" DataType="OpcUa:Image" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ImageIdentifier&gt;</BrowseName>
</Variable>
</Children>
</Object>
</Children>
<References>
<Reference IsInverse="false">
<ReferenceType>OpcUa:HasInterface</ReferenceType>
<TargetId>DI:ISupportInfoType</TargetId>
</Reference>
<Reference IsInverse="false">
<ReferenceType>OpcUa:HasInterface</ReferenceType>
<TargetId>DI:IDeviceHealthType</TargetId>
</Reference>
</References>
</ObjectType>
<ObjectType SymbolicName="DI:SoftwareType" BaseType="DI:ComponentType">
<Children>
<Property SymbolicName="DI:Manufacturer" DataType="OpcUa:LocalizedText" ValueRank="Scalar" ModellingRule="Mandatory" />
<Property SymbolicName="DI:Model" DataType="OpcUa:LocalizedText" ValueRank="Scalar" ModellingRule="Mandatory" />
<Property SymbolicName="DI:SoftwareRevision" DataType="OpcUa:String" ValueRank="Scalar" ModellingRule="Mandatory" />
</Children>
</ObjectType>
<ObjectType SymbolicName="DI:BlockType" BaseType="DI:TopologyElementType" IsAbstract="true">
<Children>
<Property SymbolicName="DI:RevisionCounter" ModellingRule="Optional" DataType="OpcUa:Int32">
</Property>
<Property SymbolicName="DI:ActualMode" ModellingRule="Optional" DataType="OpcUa:LocalizedText">
</Property>
<Property SymbolicName="DI:PermittedMode" ModellingRule="Optional" DataType="OpcUa:LocalizedText" ValueRank="Array">
</Property>
<Property SymbolicName="DI:NormalMode" ModellingRule="Optional" DataType="OpcUa:LocalizedText" ValueRank="Array">
</Property>
<Property SymbolicName="DI:TargetMode" ModellingRule="Optional" DataType="OpcUa:LocalizedText" ValueRank="Array">
</Property>
</Children>
</ObjectType>
<ObjectType SymbolicName="DI:DeviceHealthDiagnosticAlarmType" BaseType="OpcUa:InstrumentDiagnosticAlarmType" IsAbstract="true" />
<ObjectType SymbolicName="DI:FailureAlarmType" BaseType="DI:DeviceHealthDiagnosticAlarmType" IsAbstract="false" />
<ObjectType SymbolicName="DI:CheckFunctionAlarmType" BaseType="DI:DeviceHealthDiagnosticAlarmType" IsAbstract="false" />
<ObjectType SymbolicName="DI:OffSpecAlarmType" BaseType="DI:DeviceHealthDiagnosticAlarmType" IsAbstract="false" />
<ObjectType SymbolicName="DI:MaintenanceRequiredAlarmType" BaseType="DI:DeviceHealthDiagnosticAlarmType" IsAbstract="false" />
<ObjectType SymbolicName="DI:ConfigurableObjectType" BaseType="OpcUa:BaseObjectType">
<Children>
<Object SymbolicName="DI:SupportedTypes" TypeDefinition="OpcUa:FolderType">
</Object>
<Object SymbolicName="DI:ObjectIdentifier" TypeDefinition="OpcUa:BaseObjectType" ModellingRule="OptionalPlaceholder">
<BrowseName>&lt;ObjectIdentifier&gt;</BrowseName>
</Object>
</Children>
</ObjectType>
<VariableType SymbolicName="DI:LifetimeVariableType" DataType="OpcUa:Number" ValueRank="Scalar" BaseType="OpcUa:AnalogUnitType">
<Description>Remaining lifetime</Description>
<Children>
<Property SymbolicName="DI:StartValue" DataType="OpcUa:Number" ModellingRule="Mandatory">
<Description>StartValue indicates the initial value, when there is still the full lifetime left.</Description>
</Property>
<Property SymbolicName="DI:LimitValue" DataType="OpcUa:Number" ModellingRule="Mandatory">
<Description>LimitValue indicates when the end of lifetime has been reached.</Description>
</Property>
<Property SymbolicName="DI:Indication" DataType="OpcUa:NodeId" ModellingRule="Optional">
<Description>Indication gives an indication of what is actually measured / represented by the Value of the Variable and the StartValue and LimitValue.</Description>
</Property>
<Property SymbolicName="DI:WarningValues" DataType="OpcUa:Number" ValueRank="ScalarOrOneDimension" ModellingRule="Optional">
<Description>WarningValues indicates one or more levels when the end of lifetime is reached soon and can be used to inform the user when reached.</Description>
</Property>
</Children>
</VariableType>
<ObjectType SymbolicName="DI:BaseLifetimeIndicationType" BaseType="OpcUa:BaseObjectType" IsAbstract="true">
<Description>Base indication type not further defining a semantic</Description>
</ObjectType>
<ObjectType SymbolicName="DI:TimeIndicationType" BaseType="DI:BaseLifetimeIndicationType" IsAbstract="true">
<Description>Indicates the time the entity has been in use or can still be used</Description>
</ObjectType>
<ObjectType SymbolicName="DI:NumberOfPartsIndicationType" BaseType="DI:BaseLifetimeIndicationType" IsAbstract="true">
<Description>Indicates the total number of parts that have been produced or can still be produced.</Description>
</ObjectType>
<ObjectType SymbolicName="DI:NumberOfUsagesIndicationType" BaseType="DI:BaseLifetimeIndicationType" IsAbstract="true">
<Description>Indicates counting the process steps the entity has been used or can still be used for (for example usages of a punching tool).</Description>
</ObjectType>
<ObjectType SymbolicName="DI:LengthIndicationType" BaseType="DI:BaseLifetimeIndicationType" IsAbstract="true">
<Description>Indicates the abraded length, for example of a drill.</Description>
</ObjectType>
<ObjectType SymbolicName="DI:DiameterIndicationType" BaseType="DI:BaseLifetimeIndicationType" IsAbstract="true">
<Description>Indicates the abraded diameter, for example of a drill.</Description>
</ObjectType>
<ObjectType SymbolicName="DI:SubstanceVolumeIndicationType" BaseType="DI:BaseLifetimeIndicationType" IsAbstract="true">
<Description>Indicates the volume of a substance, for example of a liquid.</Description>
</ObjectType>
<ObjectType SymbolicName="DI:FunctionalGroupType" BaseType="OpcUa:FolderType">
<Children>
<Object SymbolicName="DI:GroupIdentifier" TypeDefinition="DI:FunctionalGroupType" ModellingRule="OptionalPlaceholder">
<BrowseName>&lt;GroupIdentifier&gt;</BrowseName>
</Object>
<Variable SymbolicName="DI:UIElement" TypeDefinition="DI:UIElementType" ModellingRule="Optional">
</Variable>
</Children>
</ObjectType>
<Object SymbolicName="DI:Configuration" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<Object SymbolicName="DI:Tuning" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<Object SymbolicName="DI:Maintenance" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<Object SymbolicName="DI:Diagnostics" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<Object SymbolicName="DI:Statistics" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<Object SymbolicName="DI:Status" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<Object SymbolicName="DI:Operational" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<Object SymbolicName="DI:OperationCounters" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<Object SymbolicName="DI:Identification" TypeDefinition="DI:FunctionalGroupType" DesignToolOnly="true" />
<ObjectType SymbolicName="DI:ProtocolType" BaseType="OpcUa:BaseObjectType" IsAbstract="false">
</ObjectType>
<DataType SymbolicName="DI:DeviceHealthEnumeration" BaseType="OpcUa:Enumeration">
<Fields>
<Field Name="NORMAL" Identifier="0">
<Description>This device functions normally.</Description>
</Field>
<Field Name="FAILURE" Identifier="1">
<Description>Malfunction of the device or any of its peripherals.</Description>
</Field>
<Field Name="CHECK_FUNCTION" Identifier="2">
<Description>Functional checks are currently performed.</Description>
</Field>
<Field Name="OFF_SPEC" Identifier="3">
<Description>The device is currently working outside of its specified range or that internal diagnoses indicate deviations from measured or set values.</Description>
</Field>
<Field Name="MAINTENANCE_REQUIRED" Identifier="4">
<Description>This element is working, but a maintenance operation is required.</Description>
</Field>
</Fields>
</DataType>
<ObjectType SymbolicName="DI:IOperationCounterType" BaseType="OpcUa:BaseInterfaceType" IsAbstract="true">
<Description>Interface defining counters for the duration of operation</Description>
<Children>
<Property SymbolicName="DI:PowerOnDuration" DataType="OpcUa:Duration" ModellingRule="Optional">
<Description>PowerOnDuration is the duration the Device has been powered. The main purpose is to determine the time in which degradation of the Device occurred. The details, when the time is counted, is implementation-specific. Companion specifications can define specific rules. Typically, when the Device has supply voltage and the main CPU is running, the time is counted. This can include any kind of sleep mode, but cannot include pure Wake on LAN. This value shall only increase during the lifetime of the Device and shall not be reset when the Device is restarted. The PowerOnDuration is provided as Duration, i.e., in milliseconds or even fractions of a millisecond. However, the Server is not expected to update the value in such a high frequency, but possibly once a minute or once an hour, depending on the application.</Description>
</Property>
<Property SymbolicName="DI:OperationDuration" DataType="OpcUa:Duration" ModellingRule="Optional">
<Description>OperationDuration is the duration the Device has been powered and performing an activity. This counter is intended for Devices where a distinction is made between switched on and in operation. For example, a drive can be powered on but not operating. It is not intended for Devices always performing an activity like sensors always measuring data. This value shall only increase during the lifetime of the Device and shall not be reset when the Device is restarted. The OperationDuration is provided as Duration, i.e., in milliseconds or even fractions of a millisecond. However, the Server is not expected to update the value in such a high frequency, but possibly once a minute or once an hour, depending on the application.</Description>
</Property>
<Property SymbolicName="DI:OperationCycleCounter" DataType="OpcUa:UInteger" ModellingRule="Optional">
<Description>OperationCycleCounter is counting the times the Device switches from not performing an activity to performing an activity. For example, each time a valve starts moving, is counted. This value shall only increase during the lifetime of the Device and shall not be reset when the Device is restarted.</Description>
</Property>
</Children>
</ObjectType>
<VariableType SymbolicName="DI:UIElementType" BaseType="OpcUa:BaseDataVariableType" DataType="OpcUa:BaseDataType" ValueRank="Scalar" IsAbstract="true">
</VariableType>
<ObjectType SymbolicName="DI:NetworkType" BaseType="OpcUa:BaseObjectType" IsAbstract="false">
<Children>
<Object SymbolicName="DI:ProfileIdentifier" TypeDefinition="DI:ProtocolType" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ProfileIdentifier&gt;</BrowseName>
</Object>
<Object SymbolicName="DI:CPIdentifier" TypeDefinition="DI:ConnectionPointType" ModellingRule="OptionalPlaceholder">
<BrowseName>&lt;CPIdentifier&gt;</BrowseName>
<ReferenceType>DI:ConnectsTo</ReferenceType>
</Object>
<Object SymbolicName="DI:Lock" TypeDefinition="DI:LockingServicesType" ModellingRule="Optional">
</Object>
</Children>
</ObjectType>
<ObjectType SymbolicName="DI:ConnectionPointType" BaseType="DI:TopologyElementType" IsAbstract="true">
<Children>
<Object SymbolicName="DI:NetworkAddress" TypeDefinition="DI:FunctionalGroupType" ModellingRule="Mandatory">
</Object>
<Object SymbolicName="DI:ProfileIdentifier" TypeDefinition="DI:ProtocolType" ModellingRule="MandatoryPlaceholder">
<BrowseName>&lt;ProfileIdentifier&gt;</BrowseName>
</Object>
<Object SymbolicName="DI:NetworkIdentifier" TypeDefinition="DI:NetworkType" ModellingRule="OptionalPlaceholder">
<BrowseName>&lt;NetworkIdentifier&gt;</BrowseName>
<ReferenceType>DI:ConnectsTo</ReferenceType>
</Object>
</Children>
</ObjectType>
<Method SymbolicName="DI:TransferToDeviceMethodType">
<OutputArguments>
<Argument Name="TransferID" DataType="OpcUa:Int32" />
<Argument Name="InitTransferStatus" DataType="OpcUa:Int32" />
</OutputArguments>
</Method>
<Method SymbolicName="DI:TransferFromDeviceMethodType">
<OutputArguments>
<Argument Name="TransferID" DataType="OpcUa:Int32" />
<Argument Name="InitTransferStatus" DataType="OpcUa:Int32" />
</OutputArguments>
</Method>
<Method SymbolicName="DI:FetchTransferResultDataMethodType">
<InputArguments>
<Argument Name="TransferID" DataType="OpcUa:Int32" />
<Argument Name="SequenceNumber" DataType="OpcUa:Int32" />
<Argument Name="MaxParameterResultsToReturn" DataType="OpcUa:Int32" />
<Argument Name="OmitGoodResults" DataType="OpcUa:Boolean" />
</InputArguments>
<OutputArguments>
<Argument Name="FetchResultData" DataType="OpcUa:Structure" />
</OutputArguments>
</Method>
<DataType SymbolicName="DI:FetchResultDataType" BaseType="OpcUa:Structure" IsAbstract="true">
</DataType>
<DataType SymbolicName="DI:TransferResultErrorDataType" BaseType="DI:FetchResultDataType">
<Fields>
<Field Name="Status" DataType="OpcUa:Int32" />
<Field Name="Diagnostics" DataType="OpcUa:DiagnosticInfo" />
</Fields>
</DataType>
<DataType SymbolicName="DI:TransferResultDataDataType" BaseType="DI:FetchResultDataType">
<Fields>
<Field Name="SequenceNumber" DataType="OpcUa:Int32" />
<Field Name="EndOfResults" DataType="OpcUa:Boolean" />
<Field Name="ParameterDefs" DataType="DI:ParameterResultDataType" ValueRank="Array" />
</Fields>
</DataType>
<DataType SymbolicName="DI:ParameterResultDataType" BaseType="OpcUa:Structure">
<Fields>
<Field Name="NodePath" DataType="OpcUa:QualifiedName" ValueRank="Array" />
<Field Name="StatusCode" DataType="OpcUa:StatusCode" />
<Field Name="Diagnostics" DataType="OpcUa:DiagnosticInfo" />
</Fields>
</DataType>
<ObjectType SymbolicName="DI:TransferServicesType" BaseType="OpcUa:BaseObjectType" IsAbstract="false">
<Children>
<Method SymbolicName="DI:TransferToDevice" TypeDefinition="DI:TransferToDeviceMethodType" />
<Method SymbolicName="DI:TransferFromDevice" TypeDefinition="DI:TransferFromDeviceMethodType" />
<Method SymbolicName="DI:FetchTransferResultData" TypeDefinition="DI:FetchTransferResultDataMethodType" />
</Children>
</ObjectType>
<Property SymbolicName="DI:MaxInactiveLockTime" DataType="OpcUa:Duration" ValueRank="Scalar">
<References>
<Reference IsInverse="true">
<ReferenceType>OpcUa:HasProperty</ReferenceType>
<TargetId>OpcUa:Server_ServerCapabilities</TargetId>
</Reference>
</References>
</Property>
<Method SymbolicName="DI:InitLockMethodType">
<InputArguments>
<Argument Name="Context" DataType="OpcUa:String" />
</InputArguments>
<OutputArguments>
<Argument Name="InitLockStatus" DataType="OpcUa:Int32" />
</OutputArguments>
</Method>
<Method SymbolicName="DI:RenewLockMethodType">
<OutputArguments>
<Argument Name="RenewLockStatus" DataType="OpcUa:Int32" />
</OutputArguments>
</Method>
<Method SymbolicName="DI:ExitLockMethodType">
<OutputArguments>
<Argument Name="ExitLockStatus" DataType="OpcUa:Int32" />
</OutputArguments>
</Method>
<Method SymbolicName="DI:BreakLockMethodType">
<OutputArguments>
<Argument Name="BreakLockStatus" DataType="OpcUa:Int32" />
</OutputArguments>
</Method>
<ObjectType SymbolicName="DI:LockingServicesType" BaseType="OpcUa:BaseObjectType" IsAbstract="false">
<Children>
<Property SymbolicName="OpcUa:DefaultInstanceBrowseName" DataType="OpcUa:QualifiedName" ModellingRule="None">
<DefaultValue>
<uax:QualifiedName>
<uax:NamespaceIndex>1</uax:NamespaceIndex>
<uax:Name>Lock</uax:Name>
</uax:QualifiedName>
</DefaultValue>
</Property>
<Property SymbolicName="DI:Locked" DataType="OpcUa:Boolean" />
<Property SymbolicName="DI:LockingClient" DataType="OpcUa:String" />
<Property SymbolicName="DI:LockingUser" DataType="OpcUa:String" />
<Property SymbolicName="DI:RemainingLockTime" DataType="OpcUa:Duration" />
<Method SymbolicName="DI:InitLock" TypeDefinition="DI:InitLockMethodType"></Method>
<Method SymbolicName="DI:RenewLock" TypeDefinition="DI:RenewLockMethodType"></Method>
<Method SymbolicName="DI:ExitLock" TypeDefinition="DI:ExitLockMethodType"></Method>
<Method SymbolicName="DI:BreakLock" TypeDefinition="DI:BreakLockMethodType"></Method>
</Children>
</ObjectType>
<!--BEGIN SoftwareUpdate Model-->
<!--SoftwareUpdateType-->
<ObjectType SymbolicName="DI:SoftwareUpdateType" BaseType="OpcUa:BaseObjectType" IsAbstract="false">
<Children>
<Object SymbolicName="DI:Loading" TypeDefinition="DI:SoftwareLoadingType" ModellingRule="Optional">
</Object>
<Object SymbolicName="DI:PrepareForUpdate" TypeDefinition="DI:PrepareForUpdateStateMachineType" ModellingRule="Optional">
</Object>
<Object SymbolicName="DI:Installation" TypeDefinition="DI:InstallationStateMachineType" ModellingRule="Optional">
</Object>
<Object SymbolicName="DI:PowerCycle" TypeDefinition="DI:PowerCycleStateMachineType" ModellingRule="Optional">
</Object>
<Object SymbolicName="DI:Confirmation" TypeDefinition="DI:ConfirmationStateMachineType" ModellingRule="Optional">
</Object>
<Object SymbolicName="DI:Parameters" TypeDefinition="OpcUa:TemporaryFileTransferType" ModellingRule="Optional">
</Object>
<Variable SymbolicName="DI:UpdateStatus" DataType="OpcUa:LocalizedText" ModellingRule="Optional" />
<Property SymbolicName="DI:SoftwareClass" DataType="DI:SoftwareClass" ModellingRule="Optional" />
<Property SymbolicName="DI:SoftwareSubclass" DataType="OpcUa:String" ModellingRule="Optional" />
<Property SymbolicName="DI:SoftwareName" DataType="OpcUa:String" ModellingRule="Optional" />
<Property SymbolicName="DI:UnsignedPackageAllowed" DataType="OpcUa:Boolean" ModellingRule="Optional" />
<Variable SymbolicName="DI:VendorErrorCode" DataType="OpcUa:Int32" ModellingRule="Optional">
</Variable>
<Property SymbolicName="OpcUa:DefaultInstanceBrowseName" DataType="OpcUa:QualifiedName" ModellingRule="None">
<DefaultValue>
<uax:QualifiedName>
<uax:NamespaceIndex>1</uax:NamespaceIndex>
<uax:Name>SoftwareUpdate</uax:Name>
</uax:QualifiedName>
</DefaultValue>
</Property>
</Children>
</ObjectType>
<!--SoftwareLoadingType-->
<ObjectType SymbolicName="DI:SoftwareLoadingType" BaseType="OpcUa:BaseObjectType" IsAbstract="true">
<Children>
<Variable SymbolicName="DI:UpdateKey" DataType="OpcUa:String" ModellingRule="Optional">
</Variable>
</Children>
</ObjectType>
<!--PackageLoadingType-->
<ObjectType SymbolicName="DI:PackageLoadingType" BaseType="DI:SoftwareLoadingType" IsAbstract="true">
<Children>
<Object SymbolicName="DI:CurrentVersion" TypeDefinition="DI:SoftwareVersionType" ModellingRule="Mandatory">
</Object>
<Object SymbolicName="DI:FileTransfer" TypeDefinition="OpcUa:TemporaryFileTransferType" ModellingRule="Mandatory">
</Object>
<Variable SymbolicName="DI:ErrorMessage" DataType="OpcUa:LocalizedText" ModellingRule="Mandatory">
</Variable>
<Property SymbolicName="DI:WriteBlockSize" DataType="OpcUa:UInt32" ModellingRule="Optional"/>
</Children>
</ObjectType>
<!--DirectLoadingType-->
<ObjectType SymbolicName="DI:DirectLoadingType" BaseType="DI:PackageLoadingType" IsAbstract="false">
<Children>
<Variable SymbolicName="DI:UpdateBehavior" DataType="DI:UpdateBehavior" ModellingRule="Mandatory">
</Variable>
<Property SymbolicName="DI:WriteTimeout" DataType="OpcUa:Duration" ModellingRule="Optional"/>
</Children>
</ObjectType>
<!--CachedLoadingType-->
<ObjectType SymbolicName="DI:CachedLoadingType" BaseType="DI:PackageLoadingType" IsAbstract="false">
<Children>
<Object SymbolicName="DI:PendingVersion" TypeDefinition="DI:SoftwareVersionType" ModellingRule="Mandatory">
</Object>
<Object SymbolicName="DI:FallbackVersion" TypeDefinition="DI:SoftwareVersionType" ModellingRule="Optional">
</Object>
<Method SymbolicName="DI:GetUpdateBehavior" TypeDefinition="DI:GetUpdateBehaviorCachedLoadingMethodType" ModellingRule="Mandatory"/>
</Children>
</ObjectType>
<!--FileSystemLoadingType-->
<ObjectType SymbolicName="DI:FileSystemLoadingType" BaseType="DI:SoftwareLoadingType" IsAbstract="false">
<Children>
<Object SymbolicName="OpcUa:FileSystem" TypeDefinition="OpcUa:FileDirectoryType" ModellingRule="Mandatory">
</Object>
<Method SymbolicName="DI:GetUpdateBehavior" TypeDefinition="DI:GetUpdateBehaviorFileSystemMethodType" ModellingRule="Mandatory"/>
<Method SymbolicName="DI:ValidateFiles" TypeDefinition="DI:ValidateFilesMethodType" ModellingRule="Optional"/>
</Children>
</ObjectType>
<!--SoftwareVersionType-->
<ObjectType SymbolicName="DI:SoftwareVersionType" BaseType="OpcUa:BaseObjectType" IsAbstract="false">
<Children>
<Property SymbolicName="DI:Manufacturer" DataType="OpcUa:LocalizedText" ModellingRule="Mandatory"/>
<Property SymbolicName="DI:ManufacturerUri" DataType="OpcUa:String" ModellingRule="Mandatory"/>
<Property SymbolicName="DI:SoftwareRevision" DataType="OpcUa:String" ModellingRule="Mandatory"/>
<Property SymbolicName="DI:PatchIdentifiers" DataType="OpcUa:String" ModellingRule="Optional" ValueRank="Array"/>
<Property SymbolicName="DI:ReleaseDate" DataType="OpcUa:DateTime" ModellingRule="Optional"/>
<Property SymbolicName="DI:ChangeLogReference" DataType="OpcUa:String" ModellingRule="Optional"/>
<Property SymbolicName="DI:Hash" DataType="OpcUa:ByteString" ModellingRule="Optional"/>
<Method SymbolicName="DI:Clear" ModellingRule="Optional"/>
</Children>
</ObjectType>
<!--SoftwareFolderType-->
<Method SymbolicName="DI:SoftwareFolderTypeAddMethodType" >
<InputArguments>
<Argument Name="Subclass" DataType="OpcUa:String"/>
<Argument Name="Name" DataType="OpcUa:String"/>
</InputArguments>
</Method>
<Method SymbolicName="DI:SoftwareFolderTypeDeleteMethodType" >
<InputArguments>
<Argument Name="ObjectToDelete" DataType="OpcUa:NodeId"/>
</InputArguments>
</Method>
<ObjectType SymbolicName="DI:SoftwareFolderType" BaseType="OpcUa:FolderType" IsAbstract="false">
<Children>
<Property SymbolicName="DI:SoftwareClass" DataType="DI:SoftwareClass" ModellingRule="Mandatory"/>
<Method SymbolicName="DI:Add" TypeDefinition="DI:SoftwareFolderTypeAddMethodType" ModellingRule="Mandatory"/>
<Method SymbolicName="DI:Delete" TypeDefinition="DI:SoftwareFolderTypeDeleteMethodType" ModellingRule="Mandatory"/>
</Children>
</ObjectType>
<!--PrepareStatemachine-->
<ObjectType SymbolicName="DI:PrepareForUpdateStateMachineType" BaseType="OpcUa:FiniteStateMachineType" IsAbstract="false">
<Children>
<Variable SymbolicName="DI:PercentComplete" DataType="OpcUa:Byte" ModellingRule="Optional">
</Variable>
<Method SymbolicName="DI:Prepare" ModellingRule="Mandatory">
</Method>
<Method SymbolicName="DI:Abort" ModellingRule="Mandatory">
</Method>
<Method SymbolicName="DI:Resume" ModellingRule="Optional">
</Method>
<Object SymbolicName="DI:Idle" TypeDefinition="OpcUa:InitialStateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>1</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:Preparing" TypeDefinition="OpcUa:StateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>2</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:PreparedForUpdate" TypeDefinition="OpcUa:StateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>3</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:Resuming" TypeDefinition="OpcUa:StateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>4</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:IdleToPreparing" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>12</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Idle</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Preparing</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Prepare</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:PreparingToIdle" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>21</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Preparing</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Idle</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Abort</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:PreparingToPreparedForUpdate" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>23</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Preparing</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_PreparedForUpdate</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:PreparedForUpdateToResuming" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>34</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_PreparedForUpdate</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Resuming</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Resume</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:ResumingToIdle" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>41</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Resuming</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Idle</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:PrepareForUpdateStateMachineType_Abort</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
</Children>
</ObjectType>
<!--InstallStatemachine-->
<ObjectType SymbolicName="DI:InstallationStateMachineType" BaseType="OpcUa:FiniteStateMachineType" IsAbstract="false">
<Children>
<Variable SymbolicName="DI:PercentComplete" DataType="OpcUa:Byte" ModellingRule="Optional">
</Variable>
<Variable SymbolicName="DI:InstallationDelay" DataType="OpcUa:Duration" ModellingRule="Optional">
</Variable>
<Method SymbolicName="DI:InstallSoftwarePackage" TypeDefinition="DI:InstallSoftwarePackageMethodType" ModellingRule="Optional"/>
<Method SymbolicName="DI:InstallFiles" TypeDefinition="DI:InstallFilesMethodType" ModellingRule="Optional"/>
<Method SymbolicName="DI:Uninstall" ModellingRule="Optional"/>
<Method SymbolicName="DI:Resume" ModellingRule="Mandatory"/>
<Object SymbolicName="DI:Idle" TypeDefinition="OpcUa:InitialStateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>1</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:Installing" TypeDefinition="OpcUa:StateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>2</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:Error" TypeDefinition="OpcUa:StateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>3</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:IdleToInstalling" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>12</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Idle</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Installing</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:InstallationStateMachineType_InstallSoftwarePackage</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:InstallationStateMachineType_InstallFiles</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Uninstall</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:InstallingToIdle" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>21</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Installing</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Idle</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:InstallingToError" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>23</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Installing</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Error</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:ErrorToIdle" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>31</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Error</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Idle</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:InstallationStateMachineType_Resume</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
</Children>
</ObjectType>
<!--PowercycleStateMachine-->
<ObjectType SymbolicName="DI:PowerCycleStateMachineType" BaseType="OpcUa:FiniteStateMachineType" IsAbstract="false">
<Children>
<Object SymbolicName="DI:NotWaitingForPowerCycle" TypeDefinition="OpcUa:InitialStateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>1</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:WaitingForPowerCycle" TypeDefinition="OpcUa:StateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>2</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:NotWaitingForPowerCycleToWaitingForPowerCycle" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>12</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:PowerCycleStateMachineType_NotWaitingForPowerCycle</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:PowerCycleStateMachineType_WaitingForPowerCycle</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:WaitingForPowerCycleToNotWaitingForPowerCycle" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>21</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:PowerCycleStateMachineType_WaitingForPowerCycle</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:PowerCycleStateMachineType_NotWaitingForPowerCycle</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
</Children>
</ObjectType>
<!--ConfirmStatemachine-->
<ObjectType SymbolicName="DI:ConfirmationStateMachineType" BaseType="OpcUa:FiniteStateMachineType" IsAbstract="false">
<Children>
<Method SymbolicName="DI:Confirm" ModellingRule="Mandatory">
</Method>
<Variable SymbolicName="DI:ConfirmationTimeout" DataType="OpcUa:Duration" ModellingRule="Mandatory">
</Variable>
<Object SymbolicName="DI:NotWaitingForConfirm" TypeDefinition="OpcUa:InitialStateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>1</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:WaitingForConfirm" TypeDefinition="OpcUa:StateType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:StateNumber">
<DefaultValue>
<uax:UInt32>2</uax:UInt32>
</DefaultValue>
</Property>
</Children>
</Object>
<Object SymbolicName="DI:NotWaitingForConfirmToWaitingForConfirm" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>12</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:ConfirmationStateMachineType_NotWaitingForConfirm</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:ConfirmationStateMachineType_WaitingForConfirm</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
<Object SymbolicName="DI:WaitingForConfirmToNotWaitingForConfirm" TypeDefinition="OpcUa:TransitionType" ModellingRule="None">
<Children>
<Property SymbolicName="OpcUa:TransitionNumber">
<DefaultValue>
<uax:UInt32>21</uax:UInt32>
</DefaultValue>
</Property>
</Children>
<References>
<Reference>
<ReferenceType>OpcUa:FromState</ReferenceType>
<TargetId>DI:ConfirmationStateMachineType_WaitingForConfirm</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:ToState</ReferenceType>
<TargetId>DI:ConfirmationStateMachineType_NotWaitingForConfirm</TargetId>
</Reference>
<Reference>
<ReferenceType>OpcUa:HasCause</ReferenceType>
<TargetId>DI:ConfirmationStateMachineType_Confirm</TargetId>
</Reference>
<Reference IsOneWay="true">
<ReferenceType>OpcUa:HasEffect</ReferenceType>
<TargetId>OpcUa:TransitionEventType</TargetId>
</Reference>
</References>
</Object>
</Children>
</ObjectType>
<!-- SoftwareClass -->
<DataType SymbolicName="DI:SoftwareClass" BaseType="OpcUa:Enumeration">
<Fields>
<Field Name="Firmware" Identifier="0">
<Description>The software update is used for the firmware of a physical device.</Description>
</Field>
<Field Name="Application" Identifier="1">
<Description>The software update is used for an executable software.</Description>
</Field>
<Field Name="Configuration" Identifier="2">
<Description>The software update is used for the configuration of a device or application.</Description>
</Field>
<Field Name="Solution" Identifier="3">
<Description>The software update is used to install a solution with several software package to several components.</Description>
</Field>
</Fields>
</DataType>
<!-- LocationIndicationType -->
<DataType SymbolicName="DI:LocationIndicationType" BaseType="OpcUa:UInt16" IsOptionSet="true">
<Fields>
<Field Name="Visual" BitMask="0001">
<Description>Location indication through optical signals, such as blinking LEDs, if supported by the device.</Description>
</Field>
<Field Name="Audible" BitMask="0002">
<Description>Location indication through auditory signals, such as sounds or beeps, if supported by the device.</Description>
</Field>
</Fields>
</DataType>
<!-- SoftwareVersionFileType -->
<DataType SymbolicName="DI:SoftwareVersionFileType" BaseType="OpcUa:Enumeration">
<Fields>
<Field Name="Current" Identifier="0">
<Description>The currently used version of the software identified by the CurrentVersion Object.</Description>
</Field>
<Field Name="Pending" Identifier="1">
<Description>The pending version of the software that could be installed identified by the PendingVersion Object.</Description>
</Field>
<Field Name="Fallback" Identifier="2">
<Description>The fallback version of the software identified by the FallbackVersion Object.</Description>
</Field>
</Fields>
</DataType>
<!-- UpdateBehavior -->
<DataType SymbolicName="DI:UpdateBehavior" BaseType="OpcUa:UInt32" IsOptionSet="true">
<Fields>
<Field Name="KeepsParameters" BitMask="0001">
<Description>If KeepsParameters is not set, the device will lose its configuration during update. The Client should do a backup of the parameters before the update and restore them afterwards.</Description>
</Field>
<Field Name="WillDisconnect" BitMask="0002">
<Description>If WillDisconnect is set, the OPC UA Server will restart during installation. This can be the case if the update is about the firmware of the device that hosts the OPC UA Server.</Description>
</Field>
<Field Name="RequiresPowerCycle" BitMask="0004">
<Description>If RequiresPowerCycle is set, the devices require a manual power off / power on for installation.</Description>
</Field>
<Field Name="WillReboot" BitMask="0008">
<Description>If WillReboot is set, the device will reboot during the update, inclusive of embedded infrastructure elements like an integrated switch. An update Client should take this into account since the devices behind an integrated switch are not reachable for that time.</Description>
</Field>
<Field Name="NeedsPreparation" BitMask="0010">
<Description>If NeedsPreparation is not set, the Client can install the update without maintaining the PrepareForUpdateStateMachine. This can be used to support an installation without stopping the software.</Description>
</Field>
</Fields>
</DataType>
<!-- MethodTypes -->
<Method SymbolicName="DI:InstallSoftwarePackageMethodType" >
<InputArguments>
<Argument Name="ManufacturerUri" DataType="OpcUa:String"/>
<Argument Name="SoftwareRevision" DataType="OpcUa:String"/>
<Argument Name="PatchIdentifiers" DataType="OpcUa:String" ValueRank="Array"/>
<Argument Name="Hash" DataType="OpcUa:ByteString" />
</InputArguments>
</Method>
<Method SymbolicName="DI:InstallFilesMethodType">
<InputArguments>
<Argument Name="NodeIds" DataType="OpcUa:NodeId" ValueRank="Array"/>
</InputArguments>
</Method>
<Method SymbolicName="DI:GetUpdateBehaviorFileSystemMethodType">
<InputArguments>
<Argument Name="NodeIds" DataType="OpcUa:NodeId" ValueRank="Array"/>
</InputArguments>
<OutputArguments>
<Argument Name="UpdateBehavior" DataType="DI:UpdateBehavior" />
</OutputArguments>
</Method>
<Method SymbolicName="DI:ValidateFilesMethodType">
<InputArguments>
<Argument Name="NodeIds" DataType="OpcUa:NodeId" ValueRank="Array"/>
</InputArguments>
<OutputArguments>
<Argument Name="ErrorCode" DataType="OpcUa:Int32" />
<Argument Name="ErrorMessage" DataType="OpcUa:LocalizedText" />
</OutputArguments>
</Method>
<Method SymbolicName="DI:GetUpdateBehaviorCachedLoadingMethodType">
<InputArguments>
<Argument Name="ManufacturerUri" DataType="OpcUa:String" />
<Argument Name="SoftwareRevision" DataType="OpcUa:String" />
<Argument Name="PatchIdentifiers" DataType="OpcUa:String" ValueRank="Array"/>
</InputArguments>
<OutputArguments>
<Argument Name="UpdateBehavior" DataType="DI:UpdateBehavior" />
</OutputArguments>
</Method>
<!--END SoftwareUpdate Model-->
</ModelDesign>